gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:19:15 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com