我什么时候可以使用Whatever明星?

Phi*_*l H 6 currying perl6 raku

下面这个职位上perlgeek,它给钻营的例子:

my &add_two := * + 2;
say add_two(5); # 7
Run Code Online (Sandbox Code Playgroud)

说得通.但是,如果我将中+缀运算符替换为中min缀运算符:

my &min_two := * min 2;
say min_two(5); # Type check failed in binding; expected 'Callable' but got 'Int'
Run Code Online (Sandbox Code Playgroud)

即使尝试+通过infix语法调用也会失败:

>> my &curry := &infix:<+>(2, *);
Method 'Int' not found for invocant of class 'Whatever'
Run Code Online (Sandbox Code Playgroud)

我是否需要将Whatever限定为数值,如果是,如何?还是我完全忽略了这一点?

[编辑新rakudo的回应; 以上版本字符串:perl6 version 2014.08 built on MoarVM version 2014.08]

Chr*_*oph 3

你的乐道版本有点古老。如果您想使用更新的 cygwin 版本,您可能必须自己编译它。如果您对 Windows 版本感到满意,您可以从 rakudo.org 获取二进制文件

也就是说,当前版本也没有转换* min 2为 lambda,但从粗略的测试来看,似乎是*这样对待的Inf。我的 Perl6-fu 太弱了,无法知道这是符合规范还是错误。

作为解决方法,使用

my &min_two := { $_ min 2 };
Run Code Online (Sandbox Code Playgroud)

请注意,*只有带有运算符的自动咖喱(或者更确切地说是 Perl6 语言中的“自动素数” - 参见S02),而不是函数调用,即您的第三个示例应该写为

my &curry := &infix:<+>.assuming(2);
Run Code Online (Sandbox Code Playgroud)

这是因为 Whatever- 的含义*取决于上下文:它应该是DWIM

在函数调用的情况下,它作为参数传递,让被调用者决定用它做什么。即使操作符也可以自由地显式地处理Whatever(例如1..*) - 但如果他们不这样做,Whatever操作数会将操作转换为“启动”闭包。

  • 自动启动分钟不工作已被归档为错误:[RT #122708](http://rt.perl.org/rt3/Ticket/Display.html?id=122708) (4认同)
  • **2015 年 12 月**:[RT #122708](http://rt.perl.org/rt3/Ticket/Display.html?id=122708) 已解决。两个 OP 示例现在都按预期工作: `perl6 -e'my &amp;add_two := * + 2; 说 add_two(5); # 7'` `perl6 -e '我的&amp;min_two := * min 2; 说 min_two(5); #2'` (2认同)