读取整数并返回满足一定条件的输入数

时间:2016-05-21 09:52:53

标签: haskell

我试图在haskell中编写一个小程序,它将整数作为输入,直到某个条件(比如P)完成,然后输出满足条件Q的所有元素的数量。我的代码如下

list = []
main :: IO ()
main = do
    x <- getLine
    read x : list
    if (P) then putStrLine "length (filter Q list)" else main

但我得到错误“非法逃脱序列”。有人可以提出一些建议来解决这个问题吗?我猜问题是我不能递归调用main函数? 提前谢谢。

1 个答案:

答案 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.filterlength来获取“满足条件的所有元素的数量” - 我使用even作为此类

的示例

示例运行

λ> :main
3
4
5
6
7
8
9
10
11
4 -- this is the result