【问题标题】:Haskell List comprehension: show even and double odd elementsHaskell 列表理解:显示偶数和双奇数元素
【发布时间】:2021-07-18 11:54:47
【问题描述】:

我一直在处理一项任务,但我无法完成它。

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

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)

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

我希望有人可以帮助我。

【问题讨论】:

  • 您根本不必过滤 (,odd x)(如果我的问题正确),而是考虑如何更改映射部分 (x*2) 来做您想做的事想要(提示: if ... then ... else ... 是您可以在那里使用的表达式)
  • 附加提示:odd x == not (even x) 适用于所有数字 - 在else 部分,您会看到如果您的if 的条件是not true 会发生什么...

标签: list haskell conditional-statements list-comprehension


【解决方案1】:

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

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

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

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

或者也许它可以通过一些算术技巧来完成,但它会是一个数学问题,而不是一个 Haskell 问题。

【讨论】:

  • if...then...else 没问题,这是我的主要问题。非常感谢您提供y &lt;- ([x*2 | ... x] 部分。我不知道你可以在 Haskell 中做这样的事情。
  • 括号是可选的。我已经把它们专门放进去,所以你会看到它不是y &lt;- ([x*2 | ... x],而是y &lt;- ( [x*2 | ... x] ++ [x | .... x] )。或者这就是你的意思。 :) 干杯,不客气。 ( [x*2 | ... x] ++ [x | .... x] ) 只是一种避免if 的方法,当这两个测试相互排斥时——以可能运行一个不需要的多余测试为代价,if
【解决方案2】:

如果您正在寻找 math-trick 版本:

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

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

【讨论】:

  • 啊,确实,(`mod` 2) if even...
  • 哇,这令人印象深刻。考虑一下我的想法0_0
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多