gpt4 book ai didi

loops - Haskell 进行 IO 循环的方法(无需显式递归)?

转载 作者:行者123 更新时间:2023-12-03 06:59:49 28 4
gpt4 key购买 nike

我想从 STDIN 读取由换行符分隔的字符串列表,直到出现新行并且我想要 IO [String] 类型的操作。这是我如何使用递归来做到这一点:

myReadList :: IO String
myReadList = go []
where
go :: [String] -> IO [String]
go l = do {
inp <- getLine;
if (inp == "") then
return l;
else go (inp:l);
}

然而,这种使用 go 的方法掩盖了可读性,并且是一种非常常见的模式,理想情况下人们希望将其抽象出来。

所以,这是我的尝试:

whileM :: (Monad m) => (a -> Bool) -> [m a] -> m [a]
whileM p [] = return []
whileM p (x:xs) = do
s <- x
if p s
then do
l <- whileM p xs
return (s:l)
else
return []

myReadList :: IO [String]
myReadList = whileM (/= "") (repeat getLine)

我猜测这个 whileM 已经有一些默认实现或类似的东西了。但是我找不到它。

有人能指出解决这个问题最自然、最优雅的方法是什么吗?

最佳答案

unfoldWhileM与您的 whileM 相同,只是它采用一个操作(而不是列表)作为第二个参数。

myReadList = unfoldWhileM (/= "") getLine

关于loops - Haskell 进行 IO 循环的方法(无需显式递归)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47133634/

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