折叠功能保持切换 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)
我想编写一个函数,它接受一个整数列表和 returns 一个每个元素都是负数的列表。
negate :: [Int] -> [Int]
negate xs = foldl (\x xs -> (abs x * (-1)) : xs) [] xs
该函数取反所有数组对象,同时反转数组中所有变量的位置。是什么让这个函数反转位置?
foldl
确实如此! foldl
是左折叠,因此它通过从其初始状态(您提供为 []
)和列表最左边的元素开始在您的列表上工作,并调用您的函数,该函数预先考虑否定该元素到状态。然后它获取下一个最左边的元素并做同样的事情。但是你每次都在前置,这意味着你输入的第一个元素最终对应于输出的最后一个元素,因为它是第一个被前置的。
为此您可能需要 foldr
,这是一个从最右边的元素开始的折叠。或者,使用 map
将是解决此特定问题的更简单方法。
示例代码:
makeAllNegative = map (negate . abs)