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])
となるのですね。