我对Haskell的函数式编程非常陌生,我几天前已经开始通过做一些任务来学习它。
我正在尝试编写一个函数,它将从控制台读取INT类型的列表,并打印出给定列表中的偶数使用列表理解。这就是我所拥有的:
[x | x <- [nums], x == even, x <= 50]
答案 0 :(得分:0)
你所写的内容有几个小错误:
[x | x <- [nums], x == even, x <= 50]
x <- [nums]
会将x
绑定到列表[nums] :: [[Int]]
的每个元素,其中包含一个元素nums :: [Int]
。大概你想要x <- nums
,以便x :: Int
。
x == even
尝试将x
类型Int
与even
类型Integral a => a -> Bool
进行比较(或简化为Int -> Bool
一点,even
)。您不能比较不同类型的值是否相等,也不能比较函数;您想要做的是使用x
even x
在[x | x <- nums, even x, x <= 50]
上调用函数main
。
通过这些更改,您的表达式可以正常运行:
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();});
之类的无效输入时会发生什么?你怎么能处理这个错误?