许多现代编程语言允许我们处理潜在的无限列表并对它们执行某些操作.
示例[Python]:
EvenSquareNumbers = ( x * x for x in naturals() if x mod 2 == 0 )
Run Code Online (Sandbox Code Playgroud)
这样的列表可以存在,因为只计算实际需要的元素.(懒惰的评价)
我只是想知道是否有可能(或者甚至用某些语言练习)将懒惰评估的机制扩展到算术.
示例:给出无限的偶数列表evens = [ x | x <- [1..], even x ]
我们无法计算
length evens
Run Code Online (Sandbox Code Playgroud)
因为这里要求的计算永远不会终止.
但我们实际上可以确定
length evens > 42
Run Code Online (Sandbox Code Playgroud)
无需评估整个length术语.
这有可能用任何语言吗?那么Haskell呢?
编辑:使要点更清楚:问题不在于如何确定惰性列表是否短于给定数字.它是关于使用传统内置函数的方式,数字计算是懒惰地完成的.
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 …Run Code Online (Sandbox Code Playgroud)