Debugging 你能追踪一下Haskell foldl lambda函数是如何工作的吗?

Debugging 你能追踪一下Haskell foldl lambda函数是如何工作的吗?,debugging,haskell,trace,fold,Debugging,Haskell,Trace,Fold,lambda函数显然在括号中。foldl从何处获取其初始值?在这种情况下,[b]是什么?我们可以逐步评估,比如说,myReverse[1,2,3]。我们需要定义foldl myReverse :: [a] -> [a] myReverse = foldl (\a x -> x:a) [] foldl is (a -> b -> a) -> a -> [b] -> a 所以我们有 foldl f z [] = z foldl f z (x:xs

lambda函数显然在括号中。
foldl
从何处获取其初始值?在这种情况下,
[b]
是什么?

我们可以逐步评估,比如说,
myReverse[1,2,3]
。我们需要定义
foldl

myReverse :: [a] -> [a]
myReverse = foldl (\a x -> x:a) []

foldl is (a -> b -> a) -> a -> [b] -> a
所以我们有

foldl f z []     = z
foldl f z (x:xs) = foldl f (f z x) xs
在[1]中有一条重要的警告,对于每一个降低测试值的步骤,这种降低测试值的情况实际上只有在有人仔细检查结果时才会发生。随着
foldl
的发展,
f
的重复应用越来越多,因此我们真正得到的(如果
f=\a x->x:a
)是:

这就是为什么我们有
foldl'
,它在累加器中是严格的,并防止这种thunk累积

初始值为
[]
。这种情况下的
[b]
foldl
中的
a
相同,后者是
myReverse
中的
[a]

foldl f [] [1,2,3]
foldl f (f [] 1) [2,3]
foldl f ((f 2 (f [] 1))) [3]
foldl f (((f 3 ((f 2 (f [] 1)))))) []
(((f 3 ((f 2 (f [] 1))))))
可以等效地重写为

myReverse :: [a] -> [a]
myReverse = foldl (\a x -> x:a) []
因此,折叠函数是lambda
\a x->x:a
,起始值是
[]
,要折叠的列表是
xs

myReverse :: [a] -> [a]
myReverse = foldl (\a x -> x:a) []
myReverse :: [a] -> [a]
myReverse xs = foldl (\a x -> x:a) [] xs