gpt4 book ai didi

haskell - 循环一元谓词

转载 作者:行者123 更新时间:2023-12-02 10:14:45 30 4
gpt4 key购买 nike

循环一个函数直到谓词成立

until :: (a -> Bool) -> (a -> a) -> a -> a

然而,一旦谓词具有以下形式,这就不够了

Monad m => (a -> m b)

我发现的唯一方法是通过显式递归,例如当从句柄读取直到达到 EOF 时:

  (_, (Just stdout), _, _) <- createProcess (proc "task" (args fl)){ std_out = CreatePipe }
let readH :: IO [Either String Task] -> IO [Either String Task]
readH l = do eof <- hIsEOF stdout
if eof
then l
else do line <- hGetLine stdout
l' <- l
readH.return $ (eitherDecodeStrict' line) : l'
out <- readH $ return []

是否有更高阶的函数可以简化这个过程?也许与 sequence 一起?

最佳答案

例如,您可以自己定义一个“monadic Until”函数

untilM :: Monad m => (a -> m Bool) -> (a -> m a) -> a -> m a
untilM p f = go
where
go x = do r <- p x
if r
then return x
else do a <- f x
go a

或者,如果您的谓词不需要参数,

untilM :: Monad m => m Bool -> (a -> m a) -> a -> m a
untilM p f = go
where
go x = do r <- p
if r
then return x
else do a <- f x
go a

或者甚至,你根本不需要任何争论,

untilM :: Monad m => m Bool -> m a -> m ()
untilM p f = do r <- p
if r
then return ()
else do f
untilM p f

关于haskell - 循环一元谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28614431/

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