【问题标题】:Haskell : A function that updates a state by calculating with each value of a listHaskell:一个通过计算列表的每个值来更新状态的函数
【发布时间】:2023-03-15 04:05:01
【问题描述】:

我需要一个根据值列表多次更新状态的函数:对于列表的每个值,它可能会更新状态或保持不变。所以我想我需要一个类型的函数:

[a] -> b -> (a->b->b) -> b

其中 [a] 是一个值列表,其中每个值的状态 b 可能会被更新(取决于 a 的值)。然后得到的 b 是一个应用了所有必要更新的新状态。

但是,我在 Hoogle 上找不到任何可以执行此操作的功能,因此我想我必须自己制作一个,但我不知道如何才能做到这一点。是否有任何功能可以用来完成此类功能?

如果有人能帮助我解决这个问题,将不胜感激!

最好的问候, Skyfe。

编辑:我可以拥有和需要的(简化)示例:

[a] = [1, 5, 3, 6]
b   = State{x, y, z}
f :: (a->b->b)
f a b = if someAlgorithm a then b{x=someFunc x, y=y+1} else b

=> 然后我需要的函数应该在所有 a 上执行 f 并且每次执行此操作时,它都应该返回新的(更新的或未更改的)b 作为对 f 的新调用的参数以及来自list [a],依此类推,直到它对所有元素都执行此操作,并生成应用了所有更新的最终 b。

【问题讨论】:

  • 这看起来很像折叠...
  • 在hoogle上找不到是什么意思?这是带有翻转参数的文件夹。
  • foldr :: (a -> b -> b) -> b -> [a] -> b
  • 是的,但它没有做我需要做的事情:我将如何使用 fold 多次更新一个状态,具体取决于列表中每个项目的函数结果(以及对于他们每个人,(新)状态可能会更新)?它可以简单地在项目列表上执行一个函数以将它们合并在一起,但我无法将它用于我需要的目的(或者我可能看不清楚)。
  • @user2999349 你必须更清楚地解释你的意思。只有两个函数满足你的类型签名,一个是 foldr,另一个只是返回你一开始给它的 b。

标签: list function haskell


【解决方案1】:

在您的列表中应用filter someAlgorithm 之后,您想要的是foldr f b a。如果您不知道这些功能,请在 hoogle 上查找。

【讨论】:

  • 这听起来很明智,我认为我在使用 foldr 时过于封闭,我认为它只能用于将列表与运算符合并。我会试试这个,看看它是否正常工作,谢谢!
  • 一个小问题:根据您想要浏览列表的方向,foldl' 可能比foldr 更适合。
猜你喜欢
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
相关资源
最近更新 更多