在 Haskell 中根据状态过滤列表

问题描述 投票:0回答:1

我一直在研究 ListT 的实现,以找到一种好方法来做这样的事情:

func list = do
  set <- get -- Data.Set
  el <- list
  guard $ Set.notMember el set
  return el

我知道我可以使用 ListT.fromFoldable,但我希望能够使用这个流作为更大处理管道的一部分,而无需在每一步从列表到流来回转换。

据我了解,这里应该使用流式方法。但我不明白如何使用例如来做到这一点list-t 包。遍历能否以某种方式过滤掉流中的结果?我没有看到人们问这个问题,所以也许这种方法本身就有缺陷?

list haskell monad-transformers state-monad
1个回答
0
投票

编辑前回答原问题:

据我了解,这里应该使用流式方法。但我不明白如何使用例如来做到这一点

list-t
套餐。

如果你的 monad 足够懒,你可以使用常规列表:

import Control.Monad (filterM)
import Control.Monad.Trans.State.Lazy (State, get)
import Data.Set (Set, member)

filterStateLazy :: Ord a => [a] -> State (Set a) [a]
filterStateLazy = filterM $ \x -> do
    s <- get
    pure $ x `member` s

-- >>> import qualified Data.Set as Set
-- >>> import Control.Monad.Trans.State.Lazy (evalState)
-- >>> take 5 . evalState (filterStateLazy [1..]) $ Set.fromList [1, 6, 22, 39, 54]
-- [1,6,22,39,54]
© www.soinside.com 2019 - 2024. All rights reserved.