我试图在haskell中编写一个小程序,它将整数作为输入,直到某个条件(比如P)完成,然后输出满足条件Q的所有元素的数量。我的代码如下
list = []
main :: IO ()
main = do
x <- getLine
read x : list
if (P) then putStrLine "length (filter Q list)" else main
但我得到错误“非法逃脱序列”。有人可以提出一些建议来解决这个问题吗?我猜问题是我不能递归调用main函数? 提前谢谢。
答案 0 :(得分:4)
这是我可以从你的描述中删除的内容:
readIn :: (Integer -> Bool) -> IO [Integer]
readIn stop = do
i <- read <$> getLine
if stop i then return [] else do
rest <- readIn stop
return (i:rest)
main :: IO ()
main = do
xs <- readIn (> 10)
print (length (filter even xs))
你可以看到我重构了输入列表的读取(注意我没有像"noNumber"
那样处理格式错误的输入 - 它只会在你输入的内容中起作用使用read
Integer
加入readIn
)
readIn
的第一个参数就是你的P
- 作为一个例子,我使用了(> 10)
所以如果输入的数字大于10
,它将停止要求更多
其余的只是使用List.filter
和length
来获取“满足条件的所有元素的数量” - 我使用even
作为此类
λ> :main
3
4
5
6
7
8
9
10
11
4 -- this is the result