据我了解,由于 Haskell 使用惰性求值,它允许在有限的时间内对无限列表等操作进行求值。
作为测试,我定义了以下函数
X Boolean
Y Int
f(X,Y) = (Y == 3) OR X
因此,左折叠应用于[1..]
具有False
初始值的无限整数列表和上面定义的函数,应该返回True
,因为当它到达n=3
评估f(n==3,False)
时将返回True
,因此这True
将通过函数传播。
我在 Haskell 代码中实现了这个功能
myfunc :: Bool -> Int -> Bool
myfunc True _ = True
myfunc _ n
| (n == 3) = True
| otherwise = False
并在 cli 中试用
foldl myfunc False [1..]
该命令变得无响应,表明它正在执行无限计算。为什么 Haskell 没有从这里的惰性评估中受益?