gpt4 book ai didi

haskell - 为什么 map 不强制严格,而 zipWith 却强制严格?

转载 作者:行者123 更新时间:2023-12-02 17:40:00 27 4
gpt4 key购买 nike

zipWith 函数有两个严格版本:

1) 非常严格,列表 l1 和 l2 的元素被评估,因此它们的 thunk 不会占用所有堆栈空间(Don Stewart 代码)

zipWith' f l1 l2 = [ f e1 e2 | (e1, e2) <- zipWith k l1 l2 ]
where
k x y = x `seq` y `seq` (x,y)

2)不太严格,尝试通过其他方式强制评估。

zipWith'' f l1 l2 = [ f e1 e2 | (e1, e2) <- zip (map (\x -> x `seq` x) l1) (map (\x -> x `seq` x) l2) ]

问题是:为什么使用 map 的第二个示例中的等效代码不会使函数也变得严格?

最佳答案

这是一个常见的使用错误

x `seq` x

这完全等同于

x

Neil Mitchell's post on Bad Strictness中有一个很好的解释。 .

关于haskell - 为什么 map 不强制严格,而 zipWith 却强制严格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6504034/

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