许多现代编程语言允许我们处理潜在的无限列表并对它们执行某些操作。玩无限 - 懒惰算术
实施例[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
项。
这是可能的任何语言?那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 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
其他语言的,这也可能吗?
'Perl6'有懒惰列表http://perlcabal.org/syn/S09.html#Lazy_lists – 2009-09-20 16:12:30