我正在制作一个
的功能(a->Bool) -> [a] -> State [a] [a]
我想知道是否有一种简单的方法可以通过列表存储"失败"没有通过谓词作为状态和"传递" item作为最终返回的值? 你会看到返回值和状态。样品:
*CL> runState (func (<3) [1, 2, 3]) []
([1, 2], [3])
*CL> runState (func even [1, 2, 3]) [10]
([2], [10, 1, 3])
我看起来很长很难找到答案,而且还没有找到任何关于这种特定情况的信息。我知道我可以像现在这样做,但我特别想知道我能否以上述方式做到这一点。
答案 0 :(得分:4)
你真的不需要使用州,因为你可以返回一对(passed, failed)
,但你可以这样做:
partitionSt :: (a->Bool) -> [a] -> State [a] [a]
partitionSt f l = do
let (passed, failed) = partition f l
s <- return passed
put failed
return s
或
partitionSt f l = return passed <* (put failed)
where (passed, failed) = partition f l
答案 1 :(得分:0)
好吧我明白了。我应该绑定状态的返回值和下一次迭代并返回,否则只是更新状态并迭代。 Lee通过向我展示我可以约束返回值,确实让我走上正轨。