【发布时间】: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。