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.“代码不起作用”-更具体一点。语法错误?类型错误?语义错误(您得到一个结果,但它是错误的)?在后一种情况下,还包括规范(说明什么是正确的)。这样做可能会重复,以便更清楚地显示运算符的应用顺序。这样做可以更清楚地显示运算符的应用顺序。