List Haskell递归函数从用户处读取输入,直到出现一个条件,然后将输入作为列表返回
我正在制作一个函数List Haskell递归函数从用户处读取输入,直到出现一个条件,然后将输入作为列表返回,list,haskell,recursion,io,List,Haskell,Recursion,Io,我正在制作一个函数readUntil,从用户那里读取行。当f为一行返回True时,读取停止。然后这些行作为列表返回(返回True的行不包括在该列表中)。下面是我目前拥有的(请原谅,现在有一些真正的原始/伪代码): readUntil::(String->Bool)->IO[String] 读取直到f=fmap反转(go[]),其中 go xs=do 我在下面举了一个小例子。你在解决问题上做得很好。重要的一点是记住如何生成非单子循环列表,然后将其放入单子中 collectUntil :: (Mon
readUntil
,从用户那里读取行。当f
为一行返回True时,读取停止。然后这些行作为列表返回(返回True的行不包括在该列表中)。下面是我目前拥有的(请原谅,现在有一些真正的原始/伪代码):
readUntil::(String->Bool)->IO[String]
读取直到f=fmap反转(go[]),其中
go xs=do
我在下面举了一个小例子。你在解决问题上做得很好。重要的一点是记住如何生成非单子循环列表,然后将其放入单子中
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
collectUntil::(单子m)=>MA->(a->Bool)->m[a]
动作f=do
x Bool)->IO[字符串]
readUntil=collectil getLine
f=True
。看到这样的检查,我有点惊讶。@WillemVanOnsem我做了一些伪代码开始(因为我有点卡住了),比如“在这里检查f是否为真”。对不起,我应该解释一下。我认为你很接近一个有效的解决方案。在这里,您希望使用参数x
应用f
是True
,因此我想通过一些提示,您可以想出一个解决方案。如果f x==True
,我将其更改为,并且它可以工作,谢谢a==True
与a
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