Learn You a Haskell的第6章中,介绍了以下函数:
zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith' _ [] _ = []
zipWith' _ _ [] = []
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys
作者给出了几个使用示例,我发现这些示例很容易理解。然后是这个:
ghci> zipWith' (zipWith' (*)) [[1,2,3],[3,5,6],[2,3,4]] [[3,2,2],[3,4,5],[5,4,3]]
输出[[3,4,6],[9,20,30],[10,12,12]]
这是一个惰性求值的例子吗?我尝试将 zipWith' 翻译成Scheme(见下文)。我用“简单”的例子让它工作,但不是最后一个,这让我认为 Haskell 的懒惰可能会产生影响。
(define zipWith
(lambda (f listA listB)
(cond
((null? listA) (quote ()))
((null? listB) (quote ()))
(else (cons (f (car listA) (car listB)) (zipWith f (cdr listA) (cdr listB)))))))
最佳答案
不,虽然这个示例将被延迟计算(就像 Haskell 中的任何其他函数一样),但行为并不依赖于此。在有限列表上,它的行为与急切求值的行为相同。当然,在无限列表上,它永远不会因急切求值而终止,但惰性求值允许您仅计算所需数量的列表元素。
如果您发布用于调用最后一个示例的方案 zipWith 的代码,也许我们可以帮助您了解为什么其行为不同。
关于haskell - 行动上的懒惰? ( haskell ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213919/