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)なので。