通过像函数一样的运算符

问题描述

在学习Raku时,我到达了高阶函数和排序函数的位置。

我有这个例子:

> sort <4 6 2 9 1 5 11>
(1 2 4 5 6 9 11)

然后例程的文档中说:

Sorts the list,smallest element first. By default infix:<cmp>  is used for
comparing list elements.

第9.2节我要关注的书"Piensa en raku"比较了数字排序和字典排序。

我尝试了以下操作:

> sort &le,<4 6 2 9 1 5 11>;
===SORRY!=== Error while compiling:
Undeclared routine:
    le used at line 1. Did you mean 'lc'?

但是出现此问题,而不是按字典顺序排序的列表。因此,对于我来说理解这可能还为时过早,但是应该可以像函数一样在Raku中传递一个运算符,因为文档也指出它正在使用中缀:或者我需要执行以下操作,也许我m令人困惑的运算符和子例程:

sub my-le($a,$b) {
    $a le $b;
}

sort &my-le,<4 6 2 9 1 5 11>;

或者这个:

   sort { $^b le $^a  },<4 6 2 9 1 5 11>;

所以我有一个问题,即使用不同的infix运算符和一个子例程,也许有关此差异的问题是操作数的顺序会影响某些运算的结果。因此不能轻易将其作为函数,参数或变量使用

> sort { $^a le $^b  },<4 6 2 9 1 5 11>
(9 6 5 4 2 11 1)
> sort { $^b le $^a  },<4 6 2 9 1 5 11>
(1 11 2 4 5 6 9)

我希望我能解释我对这个问题的怀疑。

解决方法

le运算符的定义如下:

sub infix:<le> { ... }

infix:前缀告诉语言它是一个中缀运算符。因此,如果您想作为&infix:<le>(1,2)的子项或您的排序对象进行呼叫:

sort &infix:<le>,<4 6 2 9 1 5 11>;
(9 6 5 4 2 11 1)

这可能对https://docs.raku.org/language/optut

有帮助 ,

添加到Scimon的答案中,并且如果您想要一个更“清晰”的演示文稿,则可以使用以下任何构造:

sort *le*,<4 6 2 9 1 5 11>;

先前的代码是一个任意构造(代码对象)。

无论构造如何使用多个*来生成带有尽可能多参数的代码块(匿名子例程):

my $c = * + *;   # same as   -> $a,$b { $a + $b }

这意味着无论用什么符号(*)表示计算中使用的两个(或更多)参数

我们的情况也是如此:

sort *le*,<4 6 2 9 1 5 11>;

与:

相同
sort * le *,<4 6 2 9 1 5 11>;   # adding space between operator and the whatever sign (*)

依次与:

sort -> $a,$b { $a le $b },<4 6 2 9 1 5 11>;   # anonymous subroutine
 

sort { $^a le $^b },<4 6 2 9 1 5 11>;

甚至

sub le {
    $^a le $^b
}

sort &le,<4 6 2 9 1 5 11>;

参考:

https://docs.raku.org/type/Whatever

https://docs.raku.org/type/Block

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...