haskell - 行动上的懒惰? ( haskell )

标签 haskell scheme lazy-evaluation higher-order-functions partial-application

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/

相关文章:

haskell - 未装箱类型的限制

haskell - 如何解压haskell存在类型?

ios - UICollectionView 单元格的 "Lazy Drawing"

haskell - 无限的惰性数字列表

c++ - C++17 是否提供生成器或其他内置方式来并行转换非实例化序列?

haskell - 生成此数组时无限循环

Haskell 类型和模式匹配问题 : extracting fields from a data type

python - 关于从非常不相关的语言(在本例中是 Scheme 到 Python)翻译代码的建议?

方案 - 将 boolean 值转换为字符串?

terminal - 通过打印字符来清除屏幕?