Могут следующие полиморфные функцииКонструкторы типа высшего порядка и функторы в OCaml
let id x = x;;
let compose f g x = f (g x);;
let rec fix f = f (fix f);; (*laziness aside*)
быть написаны для типов конструкторов/типа или модулей/функторов? Я попробовал
type 'x id = Id of 'x;;
type 'f 'g 'x compose = Compose of ('f ('g 'x));;
type 'f fix = Fix of ('f (Fix 'f));;
для типов, но он не работает.
Вот версия 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
Я "м не уверен на 100%, так как я не знаю Haskell, и я неясно о том, что сочинить FGX = ... на самом деле означает, что в Haskell, но вы можете быть заинтересованы, чтобы знать, что версия OCAML имеет модули первого класса. – nlucaroni
Я уверен, что вы не можете сделать это в ML, потому что вам нужен более высокоподобный полиморфизм. Можете ли вы привести несколько примеров того, как вы будете использовать эти типы в Haskell? –
nlucaroni, очень интересно! (Ссылка http://caml.inria.fr/cgi-bin/viewcvs.cgi/ocgl/brins/fstclassmod/, я считаю) Крис Конвей, я добавил несколько примеров. – sdcvvc