Haskell偶数次迭代

Haskell even number iteration

我试图从整数列表中删除所有奇数..但是有一些问题(我是一个新手),这是我的代码:

 evenfunc :: [Int] -> [Int]
 evenfunc li =
        x = head li
        y = tail li
        if even x
          then x : myevenfunc xs --take head an pass tail recursively
        else
          drop x li : myevenfunc xs --drop head from list and pass tail recursively

它在尝试 运行 时给了我一条 'parse error on input '='' 消息。

我做错了什么?

Haskell 不是命令语句的命令式语言,但您可以通过使用 let:

将值绑定到标识符来实现您的方法
f :: Int -> Int
f x = let y = x + 5 in y * 3

但是即使使用这个你的函数也有一些问题:

  • 你的递归调用是错误的(使用evenfunc
  • 你对 drop 的用法可能是错误的
  • 你永远不会在任何地方定义 xs

总而言之,最好使用库函数重塑您的方法。 filter 完全按照您的意愿行事:

evenfunc list = filter even list

或者,甚至:

evenfunc = filter even

当然应该首选使用 filter 的给定解决方案,但递归版本也可能具有指导意义:

evenfunc :: [Int] -> [Int]
evenfunc [] = []
evenfunc (x:xs) = if even x then x : tail else tail where
    tail = evenfunc xs  

第一行 evenfunc [] = [] 处理基本情况 - 空列表。你在你的解决方案中遗漏了这个,如果你在一个空列表上调用 head,你会得到一个异常。

第二行使用模式解构列表:x 是头部,xs 是尾部。然后我们使用 if 几乎就像在命令式语言中一样,不同之处在于它 returns 一个值(所以它实际上更接近 Java 等中的三元运算符 x ? y : z 等).为了避免重复,我们在where子句中定义了一个子表达式tail。如果你觉得在定义它们之前使用它们很奇怪,你可以使用 let 代替,它的工作方式类似。当然,计算tail就是执行递归调用