# Higher-order type constructors and functors in Ocaml

Posted
by sdcvvc
on Stack Overflow
See other posts from Stack Overflow
or by sdcvvc

Published on 2009-12-31T17:44:20Z
Indexed on
2010/03/18
5:01 UTC

Read the original article
Hit count: 435

##### ocaml

|##### functional-programming

Can the following polymorphic functions

```
let id x = x;;
let compose f g x = f (g x);;
let rec fix f = f (fix f);; (*laziness aside*)
```

be written for types/type constructors or modules/functors? I tried

```
type 'x id = Id of 'x;;
type 'f 'g 'x compose = Compose of ('f ('g 'x));;
type 'f fix = Fix of ('f (Fix 'f));;
```

for types but it doesn't work.

Here's a Haskell version for types:

```
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
```

© Stack Overflow or respective owner