型計算は

まあ↓な感じでできるのでしょうけれど

# type 'a num = unit;;
type 'a num = unit
# let incr ((): 'a num): ('a num) num = ();;
val incr : 'a num -> 'a num num = <fun>
# let zero: unit num = ();;
val zero : unit num = ()
# let decr ((): 'a num num): 'a num = ();;
val decr : 'a num num -> 'a num = <fun>
# incr (incr zero);;
- : 'a num num = ()
# decr (incr zero);;
- : 'a num = ()

テンプレートの特殊化みたいな技が無いとメタプログラミングできませんよね……。さてさて。