【发布时间】:2019-09-24 06:43:21
【问题描述】:
我想写一个函数,它接受一个整数列表并返回一个每个元素都是负数的列表。
negate :: [Int] -> [Int]
negate xs = foldl (\x xs -> (abs x * (-1)) : xs) [] xs
此函数否定所有数组对象,但也反转数组中所有变量的位置。是什么让这个函数反转位置?
【问题讨论】:
-
为了澄清。您正在使用列表,而不是数组。您的列表具有
Int类型的值。将它们视为对象可能会增加混乱。您的列表中没有任何变量,只有值。 -
请注意
negate已经存在,作为Num类的成员。map negate [1,2,3] == [-1, -2, -3]. -
为什么人们不赞成这个?关于 foldl 和 foldr 的性质的问题很有帮助,即使
map解决方案要简单得多 -
每个人都在
Prelude中建议negate:请注意,OP 想要“一个每个元素都是负数的列表”,这正是他们的实现所做的。这与“否定每个元素”不同!