僕のスクイーク脳が邪魔をして Haskell の事がどうにも理解できない!キー!!! ** Type (型) Smalltalk では Type という単語を使わず Class だけど、日本語に訳せばど ちらも型だ。Type は値(value)の種類を表す。ある値の集合を Type だと考え る事も出来る(という事は、どんな値も必ずどれか一つの型を持つという事)。 hugs で Type を見るには、:t (:type) というコマンドを使う。 :t 1 -- 1 の型 :t sin -- 関数 sin の型 型の名前は値では無いので :t で見る事は出来ない。型の情報を知るには :i (:info) を使う。 :i Num :i String 型を新しく作るには、型が取りうる値を列挙するか、既存の型を組みあせる。 -} data Satsu = Hideyo | Ichiyou | Yukichi type SatsuTaba = [Satsu] {- ** Class (型クラス) ややこしい事に、type とは別に class という物がある。これは、オブジェク ト指向の言葉で言うと「インタフェース」に近い。type が、データが何で出 来ているかというのを表すのに対して、class は、データで何が出来るかを表 す。type と class を結びつけるのに、instance という構文を使う。たとえ ばタイプ Satsu に対してイコール演算子を使えるようにする冗長な例。class を使う事で、ある関数を色んなタイプに対して使う事が出来る。 -} instance Eq Satsu where Hideyo == Hideyo = True Ichiyou == Ichiyou = True Yukichi == Yukichi = True _ == _ = False {- まとめると :Smalltalk 用語:Haskell 用語 :意味 :object :value :データ自体 :class :type :データの構造を表す :class :class :どんな操作が出来るかをまとめる :new または即値:データ構築子や値を直接書く:インスタンスの生成 :(無し) :instance :データと操作を繋げる :subclass :subclass :操作を継承する 注意すること。Smalltalk と Haskell では、クラス、インスタンスの意味が まったく違う。 ** 疑問 Smalltalk では、メソッド名が実際何をするかはレシーバで決まる。一方、他 のオブジェクト指向言語では、引数のそれぞれについてもオーバーライド出来 る。Haskell はどうなのかな?Haskell の関数の引数は一つなので、もしかし てその最初の引数の型だけで決まるのかな。 と、思ったけど違った。たとえば fmap (Smalltalk での #collect:) の型は fmap :: Functor a => (b -> c) -> a b -> a c で、二つ目の引数に制約がある。たとえば fmap (2 *) [1,2,3] のように、の 二番目の引数に制約があるので、fmap (2 *) だけだとオーバーローディング を解決できない。どーゆー順番で計算しているんだろう。。。