Perl6 log方法返回Num而不是Rat

use*_*164 3 perl6

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

say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)
Run Code Online (Sandbox Code Playgroud)

Mik*_*kov 6

在数学中,Log是一个连续函数,因此它具有数学上真实的值.Numtype描述了Perl 6中的数学实数.type Rat描述了数学上有理数.


Chr*_*oph 5

Perl6不是一个计算机代数系统,所以它把e*e像任何其他Num-并且一旦你已经有了一个浮点数,如四舍五入应类型更改为类似唯一明确的操作IntRat:计算机无法知道,如果返回值2e0(e*e).log其实代表2,还是一些2+?


bri*_*foy 5

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

没有任何物体代表天然的基础e并保持它直到它不能再持续(正如Rats不会变成Nums,除非它们必须).这是可能的,也可以让我们决定如何对待它.也许我们想要一个Rat,或FatRat甚至一定数量的小数位Num.但它没有那样做.

虽然这不是e特别的.它也不适用于10的幂:

> 100.log10
2
> 100.log10.^name
Num
Run Code Online (Sandbox Code Playgroud)

后面的代码.log10可以检查操作数是10的幂,并决定Int在这种情况下返回一个.但它必须检查每个数字,大多数数字不是10的幂.检查所有这些将减慢过程.让它变得有点"不正确"会更容易.

但是你可以.narrow用来获得一个更受约束的类型:

> 100.log10.narrow.^name
Int
Run Code Online (Sandbox Code Playgroud)

这与要求特定类型并且可能获得不同的数字不同:

> (10/3).Int
3
> (10/3).narrow.^name
Rat
Run Code Online (Sandbox Code Playgroud)

为了好玩:

 > i*i
-1+0i
 > (i*i).^name
 Complex
 > (i*i).narrow.^name
 Int
Run Code Online (Sandbox Code Playgroud)