gpt4 book ai didi

lazy-evaluation - haskell中严格版本的含义是什么?

转载 作者:行者123 更新时间:2023-12-04 07:18:36 26 4
gpt4 key购买 nike

关注 ,据说 foldl'foldl 的严格版本.

但是我很难理解, strict 是什么意思?意思是??

foldl f z0 xs0 = lgo z0 xs0
where
lgo z [] = z
lgo z (x:xs) = lgo (f z x) xs


foldl' f z0 xs0 = lgo z0 xs0
where lgo z [] = z
lgo z (x:xs) = let z' = f z x in z' `seq` lgo z' xs

最佳答案

并不广为人知,但foldl'实际上它的累加器参数是非严格的!回想一下类型:

foldl' :: (a -> b -> a) -> a -> [b] -> a

它在参数 2 中的严格性取决于为参数 1 给出的函数的严格性,如您通过 const 所见。 :
Prelude Data.List> foldl' (const (+1)) undefined [1]
2
Prelude Data.List> foldl' (const (+1)) undefined [1..4]
5

你会天真地认为,“foldl' 是严格的”意味着“在累加器参数中是严格的”。以上与此相矛盾。

然而,它更加隐蔽,因为严格性只针对循环的 cons 情况下函数应用的结果。所以如果你输入基本情况,你仍然会得到底部,但不是归纳情况:
Prelude Data.List> foldl' (const (+1)) undefined []
*** Exception: Prelude.undefined

所以严格 in argument 2还取决于参数 3 的值!

这就是我写它的方式:在它的第二个论点中“完全”严格。
foldl' f z0 xs0 = go z0 xs0
where
go !z [] = z
go !z (x:xs) = go (f z x) xs

如您所见,第二个论点确实很严格:
Prelude Data.List.Stream> foldl' (\a b -> 1) undefined [undefined]
*** Exception: Prelude.undefined

与Haskell2010版本相比:
Prelude Data.List.Stream> Data.List.foldl' (\a b -> 1 ) undefined [undefined]
1

这实际上具有实际影响——当前定义不会一致地拆箱其累加器参数。

历史记录:这是我们在 2007 年为流融合论文指定列表库的严格语义时发现的,指定严格的方法在 Duncan Coutt 的 PhD thesis 中给出。 .

关于lazy-evaluation - haskell中严格版本的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14279199/

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