można następujące funkcje polimorficznewyższego rzędu konstruktorów typu i funktory w SML
let id x = x;;
let compose f g x = f (g x);;
let rec fix f = f (fix f);; (*laziness aside*)
być napisane dla typów/konstruktorów typu lub modułów/funktorów? Próbowałem dla niektórych typów, ale nie działa.
Oto wersja Haskell dla typów:
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
ja "nie jestem w 100% pewien, ponieważ nie wiem, Haskell i jestem jasne, na co Skomponuj FGX = ... faktycznie oznacza w Haskell, ale może być zainteresowany, aby wiedzieć, że wersja rozwojowa OCAML ma moduły pierwszej klasy – nlucaroni
Jestem prawie pewny, że nie możesz tego zrobić w ML, ponieważ potrzebujesz polimorfizmu o wyższym czynniku, czy możesz podać przykłady tego, jak używałbyś tych typów w Haskell? –
nlucaroni, bardzo interesujące! (Link jest http://caml.inria.fr/cgi-bin/viewcvs.cgi/ocaml/branches/fstclassmod/ Wierzę) Chris Conway, dodałem kilka przykładów: – sdcvvc