言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Haskell まぎらわしい糞!

僕のスクイーク脳が邪魔をして 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 *) だけだとオーバーローディング
を解決できない。どーゆー順番で計算しているんだろう。。。