【问题标题】:Implementing last with foldr1用 foldr1 实现 last
【发布时间】:2014-08-11 15:38:51
【问题描述】:

我在使用 foldr1 实现最后一个函数时遇到了问题。我假设它采用最右边的元素并将其视为累加器值,然后将二进制函数应用于累加器及其邻居,直到它到达给定列表的开头。但是,下面显示的代码不起作用。有人可以告诉我它有什么问题吗?它不是返回最后一个元素,而是打印出第一个元素

last' list = foldr1 (\acc _ -> acc) list

【问题讨论】:

  • 你需要返回第二个参数,而不是第一个。
  • 但是为什么呢?我使用的是 foldr1 而不是 foldl1
  • 第二个元素是累加值——遍历的顺序改变了,参数的顺序也改变了……
  • 哦,非常感谢

标签: haskell fold


【解决方案1】:
foldr :: (a -> b -> b) -> b -> [a] -> b

如您所见,foldr 将累加器作为第二个参数,而列表中的值是第一个参数。 foldr1 的行为方式相同。所以,正如李所说,你需要让你的 lamdba 返回第二个参数而不是第一个参数。或者,你可以说foldr1 (flip const)

【讨论】:

  • flip const 不是seq,强制元素只是为了得到最后一个会很奇怪。
  • foldr1 seqfoldr1 (\_ acc -> acc) 有不同的语义。如果您使用foldr1 seq,列表中的所有thunk 都将被强制执行,但foldr1 (\_ acc -> acc) 并非如此。如果评估列表的每个元素需要很长时间,这可能是一个重要的区别。此外,如果xs 中有任何底部,foldr1 seq xs 也是底部(这可能很糟糕)。
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多