Haskell 列表理解:显示偶数和双奇数元素

Haskell List comprehension: show even and double odd elements

我一直在做一项作业,但就是无法完成它。

我应该编写一个函数,它接受一个数字列表并返回一个显示偶数但将所有奇数加倍的列表。 (基本上相同的列表,但赔率翻倍)。

doubleOdd :: [Integer] -> [Integer]
doubleOdd [] = []
doubleOdd a = [x*2 | x <- a, odd x]

我的问题是:

  1. 我只允许使用 +, -, *, /, ==, /=, sum, mod, elem, maximum, odd, even
  2. 我不知道我如何获得不同的条件使相同的值起作用(比如如果 x 是偶数 = x 并且在同一个列表理解中有:如果 x 是奇数 = x*2)

到目前为止,我只需要打印偶数或奇数,但不会同时打印.....

希望有人能帮助我。

在递归的情况下,用两个互斥的测试来处理两种可能的情况,奇数和偶数:

doubleOdd a = [ .... | x <- a, y <- ([x*2 | .... x] ++ [x | .... x]) ]

由于两个测试互斥,所以只有一个结果。

您要么必须使用 ++,要么必须使用 if...then...else。如果没有其中之一,我看不出有什么方法可以做到这一点。

或者也许可以通过一些算术技巧来完成,但那将是一道数学题,而不是 Haskell 题。

如果您正在寻找数学技巧版本:

> take 10 $ [ x + (x `mod` 2) * x | x <- [1..] ]
[2,2,6,4,10,6,14,8,18,10]

(你可以用 mod 做很多这样的作弊)