あどけない話

インターネットに関する技術的な話など

自然数の無限リストはInt?それともInteger?

Haskell で、自然数の無限リストは [1..] と書きます。でも、本当に無限なのか、疑問を持っていました。型が Integer ではなく、Int であれば、上限があるからです。

ghci で型をチェックしても、なんだかよく分りません。

Prelude> :t [1..]
[1..] :: (Enum t, Num t) => [t]

そこで、実験してみました。

僕の環境では、Int の最大値は 2^31 - 1 みたいなので、こうやってみます。

Prelude> [2^31-2..]
[2147483646,2147483647,2147483648,2147483649...

ずーと続きます。

一方で、Int だと指定してやると、ちゃんと上限で止まります。

> [2^31-2..]::[Int]
[2147483646,2147483647]

型は Integer で、ちゃんとした無限リストのようです。

ここでふと思い立ち、以下のような実験をしました。

Prelude> let a = [1..]
Prelude> :t a
a :: [Integer]

やっぱり、Integer でした。。。