只是想知道为什么Perl6的日志函数返回Num类型而不是Rat类型。
say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)
答案 0 :(得分:5)
这是因为没有人做过让它做任何事情的工作。这是语言可以处理的情况(不是Perl 6特有的情况),也可能是你不希望它处理的情况。
没有任何对象代表自然基础e
并保持不变,直到它不能再持续(就像Rat
不会变成Num
,除非他们必须)。这是可能的,也可以让我们决定如何对待它。我们可能希望在Rat
中使用FatRat
或Num
,甚至一定数量的小数位数。但它并没有这样做。
但e
并不是特别的。它也不适用于10的权力:
> 100.log10
2
> 100.log10.^name
Num
.log10
后面的代码可以检查操作数是10的幂,并决定在这种情况下返回Int
。但它必须检查每个数字,并且大多数数字不是10的幂。检查所有这些将减慢过程。让它变得有点不正确"。
但您可以使用.narrow
来获得更具约束力的类型:
> 100.log10.narrow.^name
Int
这与要求特定类型不同,可能会得到不同的数字:
> (10/3).Int
3
> (10/3).narrow.^name
Rat
为了好玩:
> i*i
-1+0i
> (i*i).^name
Complex
> (i*i).narrow.^name
Int
答案 1 :(得分:4)
Perl6不是计算机代数系统,所以它像e*e
一样对待Num
- 一旦你得到一个浮点数,只有舍入等显式操作才能将类型更改为类似Int
或Rat
的内容:计算机无法知道2e0
的返回值(e*e).log
是否实际代表2
,或某些2+ε
。< / p>