Perl6 log方法返回Num而不是Rat

时间:2017-11-28 23:55:25

标签: perl6

只是想知道为什么Perl6的日志函数返回Num类型而不是Rat类型。

say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)

2 个答案:

答案 0 :(得分:5)

这是因为没有人做过让它做任何事情的工作。这是语言可以处理的情况(不是Perl 6特有的情况),也可能是你不希望它处理的情况。

没有任何对象代表自然基础e并保持不变,直到它不能再持续(就像Rat不会变成Num,除非他们必须)。这是可能的,也可以让我们决定如何对待它。我们可能希望在Rat中使用FatRatNum,甚至一定数量的小数位数。但它并没有这样做。

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 - 一旦你得到一个浮点数,只有舍入等显式操作才能将类型更改为类似IntRat的内容:计算机无法知道2e0的返回值(e*e).log是否实际代表2,或某些2+ε。< / p>