Debugging 你能追踪一下Haskell foldl lambda函数是如何工作的吗?
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
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