¿Pueden las siguientes funciones polimórficasde orden superior constructores de tipos y funtores en Ocaml
let id x = x;;
let compose f g x = f (g x);;
let rec fix f = f (fix f);; (*laziness aside*)
ser escritos para tipos/constructores de tipos o módulos/funtores? Intenté
type 'x id = Id of 'x;;
type 'f 'g 'x compose = Compose of ('f ('g 'x));;
type 'f fix = Fix of ('f (Fix 'f));;
para los tipos, pero no funciona.
Aquí hay una versión para este tipo de Haskell:
data Id x = Id x
data Compose f g x = Compose (f (g x))
data Fix f = Fix (f (Fix f))
-- examples:
l = Compose [Just 'a'] :: Compose [] Maybe Char
type Natural = Fix Maybe -- natural numbers are fixpoint of Maybe
n = Fix (Just (Fix (Just (Fix Nothing)))) :: Natural -- n is 2
-- up to isomorphism composition of identity and f is f:
iso :: Compose Id f x -> f x
iso (Compose (Id a)) = a
I "m no es 100% seguro, ya que no sé Haskell y estoy claro en lo que compongo fgx = ... significa en realidad en Haskell, pero es posible que le interese saber que la la versión de desarrollo de OCAML tiene módulos de primera clase. – nlucaroni
Estoy bastante seguro de que no se puede hacer esto en ML, porque se necesita polimorfismo de alto grado. ¿Puedes dar algunos ejemplos de cómo usarías estos tipos en Haskell? –
nlucaroni, muy interesante! (El enlace es http://caml.inria.fr/cgi-bin/viewcvs.cgi/ocaml/branches/fstclassmod/ creo) Chris Conway, he añadido algunos ejemplos. – sdcvvc