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
更合适。