読者です 読者をやめる 読者になる 読者になる

標高+1m

Make, Hack, Think

カタ

今日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型に相当するのはfirstrestnil?を要求するインターフェースとかになるんだと思う。

なんでこれがもやもやしてたかっていうと、Carrotで総称関数の呼び出しを静的に決定しようとしてたときに、ListとかOptionとかって型でディスパッチする関数なら静的に決定できたんだけど、CLOSみたいにNilとかSomeとかNoneとかって"型"でディスパッチするのはランタイムじゃなきゃ無理っぽいんだけどなんでだろうと思ってたから。結局NilとかSomeとかNoneとかは型じゃなくてコンストラクタだからできないんだってわかってすっきりした。

直和型と動的型付けは似ている。