State Monad:修改状态而不修改值

78t66

我正在写一个带有谓词p和列表的函数它返回([value],[state])第一个列表包含合格元素的列表p,第二个列表不包含合格元素的列表但是,当我跑步时

runState (myFunc even [1,2,3,4,5]) [] 

([2,4,5,3,1],[5,3,1])将失败的元素错误地存储在的位置[value]我认为这是由于get更新状态和值所致,但是我一直无法找到一种方法来仅更新状态并仅保留值,因此我想知道如何做到这一点。

myFunc :: (a->Bool) -> [a] -> State [a] [a]
myFunc _ [] = do
  a <- get
  return a
myFunc p (x:xs) = do
    if (p x) then do
      s <- myFunc p xs
      let ret = (x:s)
      return ret
    else do
      s <- get
      put(x:s)
      myFunc p xs
Ry-

您的myFunc _ []定义确实是将状态放入了价值之中。您实际上只希望它是通过的空列表:

myFunc _ [] = return []

然后您可能想要按顺序返回结果:

myFunc :: (a -> Bool) -> [a] -> State [a] [a]
myFunc _ [] = return []
myFunc p (x:xs) = do
    passes <- myFunc p xs

    if p x then
        return (x:passes)
    else do
        modify (x:)
        return passes

编写它的一种很酷的方法,即使它可能是一种状态练习,并且partition已经存在,

import Data.Bifunctor

partition f = foldr m ([], [])
    where m x = (if f x then first else second) (x:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章