float や double のような浮動小数点型は、有限桁で切られているので当然ながら実数体を成していない。浮動小数点型では連続体濃度を表現できないのだ。

しかしこれをもって「コンピュータは連続体濃度を持つ実数体の演算ができない」と断じて良いものだろうか。float や double にはできないだけであって、何か別の数値表現を考えれば連続体濃度を扱うことだって出来るかもしれないじゃないか。

簡単のため、[0, 1) の範囲の実数だけを考えることにしよう。範囲を限定しても実数であるからには連続体濃度を持つことに変わりはない。この範囲の任意の数値は次の型で表現できるのではないだろうか。

IEnumerable<int>

どういうことかというと、IEnumerable が表現する数列を小数点以下の各桁の数字の列として考えようということだ。この考えに従うと、次のように様々な数値が表現できる。

IEnumerable<int> Num1() { yield return 1; yield return 2; yield return 3; } // 0.123
IEnumerable<int> Num2() { while ( true ) yield return 3; } // 0.33333... == 1/3
IEnumerable<int> Num2() { while ( true ) yield return 9; } // 0.99999... == 1

そもそも無限の定義とかε-δ論法とか実に「遅延評価的」だと思う。なので遅延評価を理解しているプログラマはすべからくε-δ論法もすんなりと理解できる、なんてことはない?