除去列表中的偶数

时间:2016-11-28 00:05:13

标签: haskell

我试图将列表中偶数的一半

halfEvens :: [Int] -> [Int]
halfEvens xs = [x `div` 2 | x -> xs, even x]

错误是        错误:输入' - >'

时解析错误

这是什么意思以及如何修复它? 谢谢

3 个答案:

答案 0 :(得分:2)

如果你想在列表中保留奇数:

halfEvens :: [Int] -> [Int]
halfEvens = map (\x -> if (x `mod` 2) == 0 then x `div` 2 else x)

答案 1 :(得分:1)

halfEvens :: [Int] -> [Int]
halfEvens xs = [x `div` 2 | x <- xs, even x]

x <- xs的读数为x 来自 xs

答案 2 :(得分:0)

它与你的 - &gt; 的应用有关,基本上 - &gt;是一个中缀类型的运算符,也称为函数箭头(函数构建器),其目的是在左侧向右应用参数, from -> to但列表理解适用于&lt; - ,它会执行IO操作并将其绑定到左侧参数to <- from,这是对您的函数的一个小修复:

halfEvens :: [Int] -> [Int]
halfEvens xs = [x `div` 2 | x <- xs, even x]

[编辑:忽略此处的任何其他内容] =============================================== ==========================

但是,如果你正在尝试将所有偶数除以2那么你做错了,因为这个函数只返回偶数,而丢弃所有其他数。

halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) = if even x then x `div` 2 : halfEvens else x : halfEvens

这是正确的方法,@ AlexJ136答案也很直接,这似乎比我的更有效,所以我会去做。