为什么浮点数的Haskell范围符号的行为与整数和字符的行为不同?
Prelude> [1, 3 .. 10] :: [Int]
[1,3,5,7,9]
Prelude> [1, 3 .. 10] :: [Float]
[1.0,3.0,5.0,7.0,9.0,11.0]
Prelude> ['a', 'c' .. 'f']
"ace"
Run Code Online (Sandbox Code Playgroud)
如果最后一个元素接近上限,我会理解它,但这显然不是一个舍入问题.
我在我的一个讲座中遇到了一个练习,让我对[2,2.2]的输出感到困惑.为什么在输入[2,2 ... 2]时会生成一个带有2的"无限"列表.
我理解符号的方式是第一个元素是起始界限,第二个元素是数字之间的"间隙",最后一个是列表的结尾,换句话说,当达到该数字时停止.
如果我的推理是正确的,为什么表达式[2,2 ... 2]不输出[2]?.
我以为Haskell可能会这样评价它;
我显然不能正确理解符号的工作原理,那么Haskell如何评估表达式呢?
在评估表达式时:
*main> [0, 0.1 .. 1]
Run Code Online (Sandbox Code Playgroud)
我其实在期待:
[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
Run Code Online (Sandbox Code Playgroud)
但是看到输出结果我感到非常震惊
[0.0,0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0]
Run Code Online (Sandbox Code Playgroud)
为什么Haskell在评估时产生了这个结果?