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

问题描述

我一直在处理一项任务,但我无法让它发挥作用。

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

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,14,8,18,10]

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...