只是想知道是否有人知道为什么Perl6的log函数返回Num类型而不是Rat类型。
say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)
最佳答案
这是因为尚无人做任何其他工作。这是一种语言可以处理的情况(不是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