如何在Haskell中使用两个数字创建列表?

3

以下是我的问题:声明类型并定义一个函数,该函数以两个数字m和n作为输入,并返回一个列表,其中包含m到n之间所有奇数的加倍值。例如,fun 2 11将返回[6、10、14、18、22]。

我不知道如何将数字2和11转换成列表[2..11]。有人知道如何做吗?

3个回答

6
使用序列生成(范围语法):
Prelude> [2 .. 11]
[2,3,4,5,6,7,8,9,10,11]

也适用于符号值:

Prelude> let [m,n] = [2,11]
Prelude> [m .. n]
[2,3,4,5,6,7,8,9,10,11]

1
+1 而且 [6, 10, 14, 18, 22] == [6, 10 .. 22] - josejuan

1

我已经将近两年没有使用Haskell了,如果我错了或者它不起作用,请纠正我:

getDoubledOdd :: Int -> Int -> [Int]
getDoubledOdd m n = map (2*) $ filter odd [m..n]

1
不,首先获取奇数,然后加倍:对于[2..11],奇数是[3,5,7,9,11],将它们加倍得到[6,10,14,18,22]。但我认为OP并没有要求我们完全为他解决问题。 - Mark Reed
1
你可以将 (\x -> 2 * x) 简写为 (2 *) - Mark Reed
非常感谢!你的代码很有帮助。这是我做的: getOdd m n = map (*2) (filter odd [(m)..(n)]) - user2921302
@user2921302,你可以省略一些括号。你需要在*2周围加上括号,但不需要在mn周围加上括号。此外,每当你有something ( whole rest of line )时,你可以使用something $ whole rest of line代替。 - Mark Reed

0
使用列表推导式和 range 的组合将是最常用的方法。 [ 2*x | x <- [2..11], odd x ] 该代码基本上是说“让 x 从 2 循环到 11(x <- [2..11]),如果 x 是奇数(odd x),则将 2*x 放入将被返回的列表中”。
希望这样解释清楚了。

你可以避免N个“奇数”比较,并将列表生成减少1/2的因素... - josejuan
我看到了你在最上面的评论。毫无疑问,你的方法是最简单的。但我认为列表推导式更加灵活。感谢你的评论。@josejuan - yfan
是的,请使用列表推导式,但要考虑上限/下限和步长的使用... :) - josejuan
哦,你是指[2*x | x <- [3,5..11]]吗?@josejuan - yfan
doubleOdds a b = [c, c + 4 .. b + b] where c = shift (a .|. 1) 1 - josejuan
哦,我明白了。非常好。谢谢 :) @josejuan - yfan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接