默认值
[1..5]
给出了这个
[1,2,3,4,5]
并且也可以用范围函数来完成。有没有可能改变点之间的步长,这样我就可以得到像下面这样的东西来代替?
[1,1.5,2,2.5,3,3.5,4,4.5,5]
lc8prwob1#
[1,1.5..5]
a11xaf1n2#
你必须小心浮点运算。它不能精确地表示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]
jvlzgdj93#
实际上,[1..5]是
enumFromTo 1 5
和[1,1.5..5]表示
enumFromThenTo 1 1.5 5
有关详细信息,请参见http://en.wikibooks.org/wiki/Haskell/Syntactic_sugar
rslzwgfq4#
我只想详细阐述一下上面的一些答案,正如@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
[start, abs(start - stepSize) .. end]
enumFromThenTo start abs(start - stepSize) end
[2,1.8..1]
abs(2 - 1.8) == 0.2
4条答案
按热度按时间lc8prwob1#
a11xaf1n2#
你必须小心浮点运算。它不能精确地表示1.1,所以如果你尝试
最好的方法是:
jvlzgdj93#
实际上,
[1..5]
是和
[1,1.5..5]
表示有关详细信息,请参见http://en.wikibooks.org/wiki/Haskell/Syntactic_sugar
rslzwgfq4#
我只想详细阐述一下上面的一些答案,正如@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