Haskell foldr和foldl

zai*_*aig 1 haskell

下面的代码用于生成两个列表的交集:

unionSet :: Eq a => [a] -> [a] -> [a]
unionSet a b = foldl (\acc x -> if elem x acc then acc else acc ++ [x]) a b
Run Code Online (Sandbox Code Playgroud)

为什么foldl功能有效,但是当我使用foldr它时会产生错误?

Guv*_*nte 6

foldr 有类型

(a -> b -> b) -> [a] -> b -> b
Run Code Online (Sandbox Code Playgroud)

虽然foldl有类型

(b -> a -> b) -> [a] -> b -> b 
Run Code Online (Sandbox Code Playgroud)

请注意两个参数的顺序.

(\x acc -> ...
Run Code Online (Sandbox Code Playgroud)

会修复错误.