Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell:通过计算列表中的每个值来更新状态的函数_List_Function_Haskell - Fatal编程技术网

List Haskell:通过计算列表中的每个值来更新状态的函数

List Haskell:通过计算列表中的每个值来更新状态的函数,list,function,haskell,List,Function,Haskell,我需要一个函数,根据值列表多次更新状态:对于列表中的每个值,它可能会更新状态或保持状态不变。所以我想我需要一个类型如下的函数: [a] -> b -> (a->b->b) -> b 其中[a]是一个值列表,其中每个值的状态b都可以更新(取决于a的值)。然后,生成的b是一个新状态,应用了所有必要的更新 然而,我在Hoogle上找不到任何可以实现这一点的函数,所以我想我必须自己做一个,但我不知道如何才能做到这一点。是否有任何现有的功能,我可以用来完成这样的功能 如果有

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

[a] -> b -> (a->b->b) -> b
其中[a]是一个值列表,其中每个值的状态b都可以更新(取决于a的值)。然后,生成的b是一个新状态,应用了所有必要的更新

然而,我在Hoogle上找不到任何可以实现这一点的函数,所以我想我必须自己做一个,但我不知道如何才能做到这一点。是否有任何现有的功能,我可以用来完成这样的功能

如果有人能在这方面帮助我,我将不胜感激

致以最良好的祝愿, 斯凯夫

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

[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的新调用的参数,以及列表[a]中的下一个元素,依此类推,直到它对所有元素执行此操作,并在应用所有更新的情况下生成最终b。

您需要的是在列表中应用
筛选算法后的
foldr f b a
。如果您不知道这些函数,请在hoogle上查找它们。

这看起来非常像一个折叠…您在hoogle上找不到它是什么意思?这是具有翻转参数的foldr。
foldr::(a->b->b)->b->[a]->b
是,但它不做我需要它做的事情:我如何使用fold根据列表中每个项的函数结果多次更新一个状态(对于每个项,(新)状态可能会被更新)?它可以简单地在一个项目列表上执行一个函数,将它们合并在一起,但我无法将其用于我需要的目的(或者我可能看不清楚什么)。@user2999349您必须更清楚地解释您的意思。只有两个函数满足您的类型签名,一个是foldr,另一个只是返回您最初给出的b。这听起来很合理,我认为我在使用foldr时考虑得太仔细了,我认为它只能用于将列表与运算符合并。我会试试看它是否能正常工作,谢谢!一个诡辩:根据你想从哪个方向浏览列表,
foldl'
可能比
foldr
更合适。