内置的Haskell范围函数或文字是否可以更改步长?

12
默认设置。
[1..5]

给出这个

[1,2,3,4,5]

也可以使用range函数完成。是否可以更改点之间的步长,以便我可以得到类似以下的结果?

[1,1.5,2,2.5,3,3.5,4,4.5,5] 
4个回答

25
[1,1.5..5]

你能倒着来吗?也就是说,你能按0.5递减从5到1吗? - Prithvi Boinpally
跟进:试了 [5,4.5,1],完美运行。以 0.5 的减量从 5.0 到 1.0。 - Prithvi Boinpally
1
@PrithviBoinpally 你的意思是 [5,4.5..1] 吗? - SebastianWilke

18

你在使用浮点数运算时需要小心。它无法精确表示1.1,因此如果你尝试

Prelude> [0,0.1 .. 1]
[0.0,0.1,0.2,0.30000000000000004,0.4,0.5,0.6,0.7,0.7999999999999999,0.8999999999999999,0.9999999999999999]

最好的方法更像是:

Prelude> map (/10) [0..10]
[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]

7

2
我只是想详细说明一下上面的一些答案。正如@mattiast正确提到的,
[start,abs(start-stepSize)..end]实际上只是语法糖:
enumFromThenTo start abs(start-stepSize)end
然而,请注意中间的值(在您的情况下,“1.5”)不是步长,而是应该计算其从起点到达的值。
所以,如果您想以0.2的步长递减,那么我们需要做[2,1.8..1],因为abs(2-1.8)== 0.2

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