我一直在研究 ListT 的实现,以找到一种好方法来做这样的事情:
func list = do
set <- get -- Data.Set
el <- list
guard $ Set.notMember el set
return el
我知道我可以使用 ListT.fromFoldable,但我希望能够使用这个流作为更大处理管道的一部分,而无需在每一步从列表到流来回转换。
据我了解,这里应该使用流式方法。但我不明白如何使用例如来做到这一点list-t 包。遍历能否以某种方式过滤掉流中的结果?我没有看到人们问这个问题,所以也许这种方法本身就有缺陷?
编辑前回答原问题:
据我了解,这里应该使用流式方法。但我不明白如何使用例如来做到这一点
套餐。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]