只是想知道是否有人知道为什么Perl6的log函数返回Num类型而不是Rat类型。

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

最佳答案

这是因为尚无人做任何其他工作。这是一种语言可以处理的情况(不是Perl 6的特殊情况),但是您也可能不想使用它。

没有对象可以代表自然基e并保持其自然状态,直到不再可用为止(就像Rat除非必须那样,否则不会变成Num一样)。这是可能的,也将使我们能够决定如何对待它。也许我们想要一个RatFatRat,或者甚至一个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

10-07 14:59