多くの最新のプログラミング言語では、潜在的に無限のリストを処理し、それらに対して特定の操作を実行できます。
例 [Python]:
EvenSquareNumbers = ( x * x for x in naturals() if x mod 2 == 0 )
実際に必要な要素のみが計算されるため、このようなリストが存在できます。(遅延評価)
遅延評価のメカニズムを算術演算に拡張することが可能かどうか (または、特定の言語で実践されているかどうか) を知りたいと思いました。
例: 与えられた偶数の無限リストをevens = [ x | x <- [1..], even x ]
計算できませんでした
length evens
ここで必要な計算は決して終了しないためです。
しかし、私たちは実際にそれを決定することができました
length evens > 42
length
用語全体を評価する必要はありません。
これはどの言語でも可能ですか?ハスケルはどうですか?
編集:ポイントをより明確にするために:問題は、遅延リストが特定の数値よりも短いかどうかを判断する方法に関するものではありません。数値計算が遅延して行われるように、従来の組み込み関数を使用することについてです。
sdcvvc は、Haskell のソリューションを示しました。
data Nat = Zero | Succ Nat deriving (Show, Eq, Ord)
toLazy :: Integer -> Nat
toLazy 0 = Zero
toLazy n = Succ (toLazy (n-1))
instance Num Nat where
(+) (Succ x) y = Succ (x + y)
(+) Zero y = y
(*) Zero y = Zero
(*) x Zero = Zero
(*) (Succ x) y = y + (x * y)
fromInteger = toLazy
abs = id
negate = error "Natural only"
signum Zero = Zero
signum (Succ x) = Succ Zero
len [] = Zero
len (_:x') = Succ $ len x'
-- Test
len [1..] < 42
これは他の言語でも可能ですか?