我正在创建一个从用户读取行的函数readUntil
。当f
为一行返回True时,读取停止。然后将这些行作为列表返回(返回True的行不包含在该列表中)。这就是我现在所拥有的(现在有些真正的原始/伪代码,请原谅):
readUntil :: (String -> Bool) -> IO [String]
readUntil f = fmap reverse (go []) where
go xs = do
x <- getLine
if f = True then return xs
else go (x : xs)
我还想使readUntil
递归(或实现递归辅助函数)。
答案 0 :(得分:0)
我在下面列举了一个小例子。你非常关心这个解决方案。重要的是记住你如何生成非monad重复列表,然后将其放入monad中。
collectUntil :: (Monad m) => m a -> (a -> Bool) -> m [a]
collectUntil act f = do
x <- act
if f x
then return []
else (x:) <$> collectUntil act f
readUntil :: (String -> Bool) -> IO [String]
readUntil = collectUntil getLine