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
就是执行递归调用
我试图从整数列表中删除所有奇数..但是有一些问题(我是一个新手),这是我的代码:
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
就是执行递归调用