我一直在研究 ListT 的实现,以找到一种好方法来做这样的事情:
func list = do
set <- get -- Data.Set
el <- list
guard $ Set.notMember el set
return el
我知道我可以使用 ListT.fromFoldable,但我希望能够使用此流作为更大处理管道的一部分,而无需在每一步从列表转换为流并返回。也许是这样的:
func' list = (ListT.toReverseList . ListT.take 5 . func . ListT.fromFoldable) list
据我了解,这里应该使用流式传输方法。但我不明白如何使用例如list-t package来做到这一点。遍历能否以某种方式过滤掉流中的结果?我没有看到人们问这个问题,所以也许这种方法本身就有缺陷?
回答编辑前的原始问题:
如果你的 monad 足够懒,你可以使用常规列表:
如果你真的想要
ListT
,你也可以使用它,并且不需要惰性 monad:虽然 @effectously 的答案效果很好,但您可能正在
mfilter
寻找Control.Monad
:在上下文中,借用 @effectively 的例子: