许多现代编程语言允许我们处理潜在的无限列表并对它们执行某些操作。
示例 [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
这在其他语言中也可以吗?