关于Haskell中foldl (flip (:)) [] [2,4,6]运算顺序的困惑求助
理解Haskell中
foldl (flip (:)) [] [2,4,6]的运算过程 你对foldl的调用逻辑有误,foldl不会将整个列表一次性传入折叠函数,而是逐个遍历列表元素,从左到右依次把累积值和当前元素传给折叠函数。先明确几个核心点:
(:)是列表构造函数,作用是把元素加到列表头部,比如2 : []结果为[2],类型是a -> [a] -> [a]flip (:)反转了(:)的参数顺序,类型变为[a] -> a -> [a],即接收一个列表和一个元素,把元素插到列表头部,比如flip (:) [] 2等价于2 : []
foldl的通用运算规则是:foldl f z [x1, x2, x3] = f (f (f z x1) x2) x3
现在一步步推导foldl (flip (:)) [] [2,4,6]:
- 初始累积值
z = [],第一个元素x1=2:调用flip (:) [] 2→ 结果为[2] - 新的累积值变为
[2],处理第二个元素x2=4:调用flip (:) [2] 4→ 等价于4 : [2],结果为[4,2] - 新的累积值变为
[4,2],处理第三个元素x3=6:调用flip (:) [4,2] 6→ 等价于6 : [4,2],结果为[6,4,2]
整个过程是左折叠,每次将当前元素插入累积列表的头部,最终得到原列表的反转结果。
内容的提问来源于stack exchange,提问作者Julia Navarro
相关产品推荐
相关产品推荐

