Ich versuche, eine kostenlose Monad-Bibliothek in Ocaml, Control.Monad.Free von Haskell zu schreiben, aber ich bin an einem Punkt fest, in der Implementierung von hoistFree.Widen Typen in Ocaml
hoistFree :: Functor g => (forall a. f a -> g a) -> Free f b -> Free g b
hoistFree _ (Pure a) = Pure a
hoistFree f (Free as) = Free (hoistFree f <$> f as)
Hier ist mein Versuch einer Übersetzung.
Leider bekomme ich einen Fehler, der mir sagt, dass ich die Art von g nicht richtig verbreite.
Error: This definition has type ('b m t -> 'b m t) -> 'b m -> 'b m
which is less general than 'a. ('a t -> 'a t) -> 'b m -> 'b m
Alles funktioniert gut, wenn ich nicht die Funktion Typanmerkung einfügen, aber dann als die Fehlermeldung sagt, ich habe nicht den allgemeinen Typen für f. Wo ist das Problem? Wie kann ich die Art von f erweitern?
danke für die Antwort. Ich versuche immer noch, deine Idee in meiner speziellen Umgebung umzusetzen. – stackman