gpt4 book ai didi

raku - 具有未定义 Perl6 值的数学

转载 作者:行者123 更新时间:2023-12-04 02:11:15 24 4
gpt4 key购买 nike

我对数学如何处理未定义的值感到有些困惑。我的 Perl 5 直觉告诉我,这些值在大多数情况下都等于 0,例如:

> my $x
(Any)
> $x += 5
5

正如预期的那样。
> my $x
(Any)
> $x *= 3
3

等等,什么?现在就好像未定义的值被解释为 1 .

我知道 Perl6 对某些运算符有一些标识元素的概念:
> [*] ()
1

也许乘以一个未定义的值与某种方式有关......?

这究竟是如何工作的?

最佳答案

运算符只是具有特殊名称的(多)子。您看到的行为是因为 &infix:<*> ( * 的子名称)有一个无参数和一个单参数候选:

$ perl6 -e 'say infix:<*>()'
1
$ perl6 -e 'say infix:<*>(42)'
42
$ perl6 -e 'say infix:<*>(6,7)'
42

当您这样做时 [*] () ,你击中了无参数的候选人。这对于其他中缀的工作方式类似:
$ perl6 -e 'say infix:<+>()'
0
$ perl6 -e 'say infix:<+>(666)'
666

对于某些运营商,例如 / ,这是 不是 工作:
$ perl6 -e 'say infix:</>()'
No zero-arg meaning for infix:</>

但这是可以预料的,从数学上讲:-)

回到 *= :元操作本质上是使用运算符并从中创建一个新的运算符( Callable )。所以,在这个例子中, += ,基本上是 sub metaop(&op) {(-> \a, \b { a = a.DEFINITE ?? op(a,b) !! op(b) } }; metaop([+])($x,3) .请注意,为第一个参数(也称为左侧)添加了一个特殊检查以处理它未定义的情况。这就是为什么那里没有警告的原因。所以这是非常刻意的,否则生成的代码将是 -> \a, \b { a = op(a,b) }

关于raku - 具有未定义 Perl6 值的数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57210795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com