Haskell foldr和foldl

Haskell foldr和foldl,haskell,Haskell,下面的代码用于生成两个列表的交集: unionSet :: Eq a => [a] -> [a] -> [a] unionSet a b = foldl (\acc x -> if elem x acc then acc else acc ++ [x]) a b 为什么foldl函数起作用,但当我使用foldr时,它会生成错误?foldr具有以下类型 (a -> b -> b) -> [a] -> b -> b 而foldl具有 (b -

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

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

为什么
foldl
函数起作用,但当我使用
foldr
时,它会生成错误?

foldr
具有以下类型

(a -> b -> b) -> [a] -> b -> b
foldl
具有

(b -> a -> b) -> [a] -> b -> b 
请注意这两个参数的顺序

(\x acc -> ...

将修复错误。

foldr
具有

(a -> b -> b) -> [a] -> b -> b
foldl
具有

(b -> a -> b) -> [a] -> b -> b 
请注意这两个参数的顺序

(\x acc -> ...

将修复错误。

1。不能“两个列表相交”。可以将集合相交。你的代码提到的是“联合”,而不是“交叉”。可以使用列表表示集合。但大多数时候,你不应该这样做。2.“代码不起作用”-更具体一点。语法错误?类型错误?语义错误(您得到一个结果,但它是错误的)?在后一种情况下,还包括规范(说明什么是正确的)。不能“两个列表相交”。可以将集合相交。你的代码提到的是“联合”,而不是“交叉”。可以使用列表表示集合。但大多数时候,你不应该这样做。2.“代码不起作用”-更具体一点。语法错误?类型错误?语义错误(您得到一个结果,但它是错误的)?在后一种情况下,还包括规范(说明什么是正确的)。这样做可能会重复,以便更清楚地显示运算符的应用顺序。这样做可以更清楚地显示运算符的应用顺序。