从控制台读取INT类型列表,并打印出给定列表中的偶数使用列表解析

时间:2018-05-05 16:55:35

标签: haskell list-comprehension

我对Haskell的函数式编程非常陌生,我几天前已经开始通过做一些任务来学习它。

我正在尝试编写一个函数,它将从控制台读取INT类型的列表,并打印出给定列表中的偶数使用列表理解。这就是我所拥有的:

[x | x <- [nums], x == even, x <= 50]

1 个答案:

答案 0 :(得分:0)

你所写的内容有几个小错误:

[x | x <- [nums], x == even, x <= 50]
  1. x <- [nums]会将x绑定到列表[nums] :: [[Int]]的每个元素,其中包含一个元素nums :: [Int]。大概你想要x <- nums,以便x :: Int

  2. x == even尝试将x类型Inteven类型Integral a => a -> Bool进行比较(或简化为Int -> Bool一点,even)。您不能比较不同类型的值是否相等,也不能比较函数;您想要做的是使用x even x[x | x <- nums, even x, x <= 50] 上调用函数main

  3. 通过这些更改,您的表达式可以正常运行:

    IO

    现在,至于从控制台读取值,您可以从main :: IO () main = do putStrLn "Enter space-separated list of numbers." line <- getLine let nums = map read (words line) :: [Int] print [x | x <- nums, even x, x <= 50] 执行此操作,因为它需要words

    map read

    这使用Int分隔空格上的行10 25 30 45 50 60,将结果列表中的每个字符串转换为[10,30,50],最后将列表理解用于计算输出。现在,10, 20, foo等输入将生成if等输出。

    进行一些练习以提高您的理解:

    • 将提示,解析和列表推导移动到具有类型签名的单独顶级函数定义中。

    • 当用户输入let first = document.getElementById('firstAnimationDiv'); if (first) first.addEventListener('mouseenter', function() {firstAnimation.play();}); 之类的无效输入时会发生什么?你怎么能处理这个错误?