今日Object-Oriented Programming Versus Abstract Data Typesってけっこう昔の論文読んで、最近もやもやしてたことが解決した。
クラスを型みたいに使う言語が多いから、そんなもんなんだろうと思ってたけど、クラスは型じゃなくて型のコンストラクタなんだ。
data List a = Cons a (List a) | Nil map f Nil = ... map f x:xs = ...
ていうのはクラスを使うと
class Cons def map ... end class Nil def map ... end
こんなかんじになるはずで、Listクラスにはならない。
OOPだと型はoperationally defined(手続きによって定義される)なのでList型に相当するのはfirst
とrest
とnil?
を要求するインターフェースとかになるんだと思う。
なんでこれがもやもやしてたかっていうと、Carrotで総称関数の呼び出しを静的に決定しようとしてたときに、ListとかOptionとかって型でディスパッチする関数なら静的に決定できたんだけど、CLOSみたいにNilとかSomeとかNoneとかって"型"でディスパッチするのはランタイムじゃなきゃ無理っぽいんだけどなんでだろうと思ってたから。結局NilとかSomeとかNoneとかは型じゃなくてコンストラクタだからできないんだってわかってすっきりした。
直和型と動的型付けは似ている。