【问题标题】:Haskell: scan an ArrayHaskell:扫描一个数组
【发布时间】:2022-10-10 00:34:29
【问题描述】:

我有一系列食物:

myArray :: Array Int Foo

我想使用类似于以下的功能从左到右“扫描”它:

getNextStep :: Bar -> Foo -> Bar

我想扫描 myArray 以生成 Bars 数组:

scanl :: (Bar -> Foo -> Bar) -> Bar -> Array Int Foo -> Array Int Bar

是的,这与前奏曲的scanl 非常相似。但是有数组的版本吗?我可以用例如构建一个吗?可遍历? 谢谢

【问题讨论】:

  • 答案“可以吗?”问题几乎总是“是的”在编程世界中,具有不同程度的“但...”你有没有尝试过这个目标?
  • 通过从和到列表(toList、fromList)的转换很容易做到。但是我很惊讶没有找到用于数组的函数scanl,所以我想知道我是否遗漏了什么!
  • 可以使用foldrfoldl 在此处产生scanl 的行为。

标签: haskell


【解决方案1】:

mapAccumL 适用于任何 Traversable。它比扫描更通用一点,但是如果您使用发出未更改状态值的阶跃函数,您或多或少会再次获得扫描。

> mapAccumL (s x -> (s + x, s)) 0 [1,2,3,4]
(10,[0,1,3,6])

如果您希望像使用 scanl 一样包含最后一个元素,则必须将其添加回数组中。 Traversables 通常没有办法添加元素,所以我们不能让它对任何可遍历对象起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多