12

默认

[1..5]

给了这个

[1,2,3,4,5]

也可以用范围函数来完成。是否可以更改点之间的步长,以便我可以得到类似下面的东西?

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

4 回答 4

24
[1,1.5..5]
于 2009-02-09T19:53:51.560 回答
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]
于 2009-02-09T20:40:54.677 回答
7

实际上,[1..5]是语法糖

enumFromTo 1 5 

并且[1,1.5..5]对于

enumFromThenTo 1 1.5 5

有关详细信息,请参阅http://en.wikibooks.org/wiki/Haskell/Syntactic_sugar

于 2009-02-10T17:56:58.753 回答
0

我只是想详细说明上面的一些答案。正如@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

于 2020-11-13T08:12:35.040 回答