[0,1]と[0..1]の違い

前のエントリにコメントを頂いたので調べてみた。

Main> :t [0]
[0] :: Num a => [a]
Main> :t [0,1]
[0,1] :: Num a => [a]
Main> :t [0..1]
enumFromTo 0 1 :: (Enum a, Num a) => [a]
Main> 

ということで、Haskellでは範囲指定で作ったリストは要素を指定したリストとは型が違うらしい。前のエントリでは突然出てきたenumFromToがよく分からなかったのだが、これを見るとどうやら[0..1]はenumFromTo 0 1のシンタックス・シュガーということなのだろう。

確かに、

Main> enumFromTo 0 1
[0,1]
Main> :t enumFromTo 0 1
enumFromTo 0 1 :: (Enum a, Num a) => [a]

これは[0..1]と同じもののようだ。

ちなみに、enumFromToは普通の関数なので、カリー化できる。

Main> :t enumFromTo 0
enumFromTo 0 :: (Enum a, Num a) => a -> [a]

でも、以下のような無限数列とは違う。

Main> :t [0..]
enumFrom 0 :: (Enum a, Num a) => [a]

よく見るとこの場合はenumFromToではなくenumFromという別の関数になっている。