【问题标题】:fold function keep switching var locationsfold 函数不断切换 var 位置
【发布时间】: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 想要“一个每个元素都是负数的列表”,这正是他们的实现所做的。这与“否定每个元素”不同!

标签: haskell recursion fold


【解决方案1】:

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

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

示例代码:

makeAllNegative = map (negate . abs)

【讨论】:

    猜你喜欢
    • 2020-02-28
    • 2012-07-06
    • 2018-07-29
    • 2018-04-09
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多