gpt4 book ai didi

haskell - 如何使用带有无限列表的 filterM

转载 作者:行者123 更新时间:2023-12-03 15:01:37 24 4
gpt4 key购买 nike

我试图通过附加一个数字来查找目录名称,直到找到一个尚不存在的名称:

head <$> filterM (fmap not . fexists_) [ getDatedDir t d n | n <- [0..] ]

问题在于它永远不会返回。我认为问题在于,虽然 IO 是一个 Functor,但是 filterM 必须在 head effects 之前做所有的 IO;也就是说,它必须为每个 n 评估 fexists - 这当然是无限的。

现在,我可以解决这个问题:
go t d 0
where go t d n = do
let dir = getDatedDir t d n
fexists_ dir >>= \case
False -> return dir
True -> go t d (n+1)

但我觉得应该有一个更优雅的方法,使用 filterM 或类似的东西。

这感觉就像一个足够常见的模式,在 Control.Monad 中可能存在一个现有的函数,我只是没有看到它。

最佳答案

firstM来自 Control.Monad.Loops :

firstM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)

return the first value from a list, if any, satisfying the given predicate.

关于haskell - 如何使用带有无限列表的 filterM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47272933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com