Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell递归函数从用户处读取输入,直到出现一个条件,然后将输入作为列表返回_List_Haskell_Recursion_Io - Fatal编程技术网

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