Haskell 用foldl替换foldr
我有这个函数来求列表中奇数的和:Haskell 用foldl替换foldr,haskell,Haskell,我有这个函数来求列表中奇数的和: idOdd xs = foldr (\x acc -> if odd x then x+acc else acc) 0 xs 如果我想使用foldl,它将如何更改?只需更改lambda的签名,因为它应该首先使用累加器,然后使用列表元素: idOdd2 xs = foldl (\acc x -> if odd x then x+acc else acc) 0 xs 始终使用:t如果您不确定如何使用函数只需更改lambda的签名,因为它应该首先使用
idOdd xs = foldr (\x acc -> if odd x then x+acc else acc) 0 xs
如果我想使用foldl,它将如何更改?只需更改lambda的签名,因为它应该首先使用累加器,然后使用列表元素:
idOdd2 xs = foldl (\acc x -> if odd x then x+acc else acc) 0 xs
始终使用
:t
如果您不确定如何使用函数
只需更改lambda的签名,因为它应该首先使用累加器,然后使用列表元素:
idOdd2 xs = foldl (\acc x -> if odd x then x+acc else acc) 0 xs
始终使用
:t
如果您不确定如何使用函数
在您的情况下,这很简单,您只需交换参数的顺序即可使其正常工作:
idOdd2 = foldl (\acc x -> if odd x then x + acc else acc) 0
这主要是因为累加器类型与列表元素类型相同,并且+
是可交换和关联的。这一点很重要,因为foldl
和foldr
如何减少列表:
isOdd [1, 2, 3, 4, 5] = 1 + (3 + (5 + 0)) = 9
isOdd2 [1, 2, 3, 4, 5] = ((0 + 1) + 3) + 5 = 9
在本例中,
1+(3+(5+0))==((0+1)+3)+5
,但并非所有运算符都是如此,例如:
或++
在本例中,非常简单,您只需交换参数顺序即可使其正常工作:
idOdd2 = foldl (\acc x -> if odd x then x + acc else acc) 0
这主要是因为累加器类型与列表元素类型相同,并且+
是可交换和关联的。这一点很重要,因为foldl
和foldr
如何减少列表:
isOdd [1, 2, 3, 4, 5] = 1 + (3 + (5 + 0)) = 9
isOdd2 [1, 2, 3, 4, 5] = ((0 + 1) + 3) + 5 = 9
在这种情况下,
1+(3+(5+0))==((0+1)+3)+5
,但并非所有操作符都是如此,例如:
或++
通常,您可以使用foldl实现foldr,反之亦然。例如:
foldr' f e xs = foldl (flip f) e (reverse xs)
通常,可以使用foldl实现foldr,反之亦然。例如:
foldr' f e xs = foldl (flip f) e (reverse xs)
@是的,对不起!你试了什么?你能和我们分享一些尝试,以便我们能把你推向正确的方向吗?披露解决方案几乎没有用…@bheklillr是的,对不起!你试了什么?你能和我们分享一些尝试,以便我们能把你推向正确的方向吗?公开解决方案几乎没有用。。。