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

IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

haskellの型推論わからん

99 problemsのquestion 9の回答をみたら、span関数がありました。

http://www.haskell.org/hoogle/?hoogle=span

Prelude> :t span
span :: (a -> Bool) -> [a] -> ([a], [a])

第一引数は関数なので、適当にidを渡してみたところ、こうなりました。

Prelude> :t span id
span id :: [Bool] -> ([Bool], [Bool])
Prelude> 

なんでこうなるんだろうと、小一時間。

spanの第一引数は、 a->Bool
idは、a->a
なので、型が合わないのに何でエラーにならないのだろうと疑問に思いました。

それから、span idの第一引数がなんでBoolになっているんだろうと。

よくよく考えるとaは多相型なんですね。

比較してみると、

左辺 右辺
span idの第一引数 a -> Bool a Bool
id a->a a a

なので、右辺に着目すると a は Boolとなっています。

spanの型の第二引数以降は、

[a] -> ([a],[a])

なので、

[Bool]->([Bool],[Bool])

となるのですね。