Haskell:返回值,状态和状态monad

时间:2015-04-05 08:51:44

标签: haskell return state-monad

我正在制作一个

的功能
(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])

我看起来很长很难找到答案,而且还没有找到任何关于这种特定情况的信息。我知道我可以像现在这样做,但我特别想知道我能否以上述方式做到这一点。

2 个答案:

答案 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通过向我展示我可以约束返回值,确实让我走上正轨。