从列表中删除奇数元素

MrD*_*MrD 2 haskell

我正在尝试创建一个短函数来从整数列表中删除奇数元素,我的代码是:

removeOdds :: [Int] -> [Int]
removeOdds lst = [ x | x <- lst, x `mod` 2]
Run Code Online (Sandbox Code Playgroud)

编译返回 -

Type error in boolean qualifier
*** Term           : x `mod` 2
*** Type           : Int
*** Does not match : Bool
Run Code Online (Sandbox Code Playgroud)

有什么建议?谢谢!

bhe*_*ilr 5

你需要

x `mod` 2 == 0
Run Code Online (Sandbox Code Playgroud)

mod函数返回一个Int,它必须先转换为a Bool才能作为条件使用.

另一种解决方案是

evens :: [Int] -> [Int]
evens xs = filter even xs
Run Code Online (Sandbox Code Playgroud)

在进行eta-reduction之后,您甚至可以将其定义为

evens :: [Int] -> [Int]
evens = filter even
Run Code Online (Sandbox Code Playgroud)

虽然我建议使用限制较少的类型签名来允许所有Integral类型,因为even有签名Integral a => a -> Bool:

evens :: Integral a => [a] -> [a]
evens = filter even
Run Code Online (Sandbox Code Playgroud)

  • @DarioP不要因为不得不提出有关基本事情的问题而道歉.你仍然在学习一种与大多数编程语言截然不同的语言,因此它的学习曲线相对陡峭.只是继续练习,很快你就会回答这些问题而不是问他们=) (2认同)