void

いつもの人がいつものようにS/N比超下げまくってるなー、とか思ってたら、Rossbergがツッコミを入れていた。まじめだ。

解説:unitは属する値が一つしかない型で、「特に返り値がない」関数の返り値の型。あと、「特に引数がない」関数の引数の型。それに対し、voidは属する値が一つもない型で、決して返ってこない関数の返り値の型。あと、決して呼び出せない関数の引数の型(これは普通は不要だけど)。意味としては

type unit = Unit
type void = Void of void

と同様。使い方は

# let rec f Unit = Void(f Unit) ;;
val f : unit -> void = <fun>
# f Unit ;;
Stack overflow during evaluation (looping recursion?).
# let g Unit = Void(raise(Failure "hehe")) ;;
val g : unit -> void = <fun>
# g Unit ;;
Exception: Failure "hehe".

とか。ちなみに、Cで「返り値がない」関数の返り値の型や、「引数がない」関数の引数の型がvoidになってるのは、ただの歴史的経緯(Algolのせい?)で型理論的には間違い。unitは×の単位元(1)で、voidは+の単位元(0)なので。