Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 用foldl替换foldr_Haskell - Fatal编程技术网

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是的,对不起!你试了什么?你能和我们分享一些尝试,以便我们能把你推向正确的方向吗?公开解决方案几乎没有用。。。