折叠功能保持切换 var 位置

fold function keep switching var locations

我想编写一个函数,它接受一个整数列表和 returns 一个每个元素都是负数的列表。

negate :: [Int] -> [Int]
negate xs = foldl (\x xs -> (abs x * (-1)) : xs) [] xs

该函数取反所有数组对象,同时反转数组中所有变量的位置。是什么让这个函数反转位置?

foldl 确实如此! foldl 是左折叠,因此它通过从其初始状态(您提供为 [])和列表最左边的元素开始在您的列表上工作,并调用您的函数,该函数预先考虑否定该元素到状态。然后它获取下一个最左边的元素并做同样的事情。但是你每次都在前置,这意味着你输入的第一个元素最终对应于输出的最后一个元素,因为它是第一个被前置的。

为此您可能需要 foldr,这是一个从最右边的元素开始的折叠。或者,使用 map 将是解决此特定问题的更简单方法。

示例代码:

makeAllNegative = map (negate . abs)