【问题标题】:Math with undefined Perl6 values具有未定义 Perl6 值的数学
【发布时间】:2019-11-26 20:04:31
【问题描述】:

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

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

正如预期的那样。

> my $x
(Any)
> $x *= 3
3

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

我知道 Perl6 对某些运算符有一些标识元素的概念:

> [*] ()
1

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

这究竟是如何工作的?

【问题讨论】:

    标签: raku


    【解决方案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:</>
    

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

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

    【讨论】:

    • 但是$x+=3 应该等价于$x = $x + 3。但是,如果您在该表达式中使用 Nil 或 Any 替换 $x,则会出错。 (whatever)= 是否特殊,以便在参数之一为 Nil 的情况下使用单个参数调用运算符?
    • Metaops 本质上是在使用操作符并从中创建一个新的操作。所以,在这个例子中,+=,基本上就是sub metaop(&amp;op) {(-&gt; \a, \b { a = a.DEFINITE ?? op(a,b) !! op(b) } }; metaop([+])($x,3)。请注意,为第一个参数(也称为左侧)添加了特殊检查,以处理未定义的情况。这就是为什么那里没有警告。所以这是非常刻意的,否则生成的代码将是-&gt; \a, \b { a = op(a,b) }
    • @ElizabethMattijsen 也许将您对*= 元运算符如何构建的评论移至您的答案中?这确实是我要问的主要问题的答案。指向描述这种行为的文档的指针(如果有的话)也会很好;我努力寻找,但什么也找不到。
    • 我将其解读为“做一些有用的事情”作为默认设计 - 所以添加 0 会产生有意义的结果(您首先想到的数字) - mul 1 同上。然而 mul 0 总是返回零。
    猜你喜欢
    • 2022-01-13
    • 2020-09-15
    • 2011-06-14
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多