Haskell递归函数从用户读取输入直到条件,然后将输入作为列表返回

时间:2018-04-21 12:41:47

标签: list haskell recursion io

我正在创建一个从用户读取行的函数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递归(或实现递归辅助函数)。

1 个答案:

答案 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