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

时间:2014-09-04 15:13:31

标签: currying perl6

关注this post on perlgeek,它给出了一个currying示例:

my &add_two := * + 2;
say add_two(5); # 7

有道理。但是,如果我将+中缀运算符替换为min中缀运算符:

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

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

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

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

[来自更新的rakudo的回复;上面的版本字符串:perl6 version 2014.08 built on MoarVM version 2014.08]

1 个答案:

答案 0 :(得分:3)

您的Rakudo版本有点古老。如果你想使用更新的cygwin版本,你可能需要自己编译。如果您对Windows版本不满意,可以get a binary from rakudo.org

也就是说,当前版本也没有将* min 2转换为lambda,但是从粗略测试中,似乎将*视为Inf。我的Perl6-fu太弱了,不知道这是出于规格还是错误。

作为解决方法,请使用

my &min_two := { $_ min 2 };

请注意,*仅使用运算符自动调整(或者更确切地说是Perl6中的自动素数 - 请参阅S02),而不是函数调用,即您的第3个示例应写成

my &curry := &infix:<+>.assuming(2);

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

在函数调用的情况下,它作为参数传递,让被调用者决定它想要做什么。即使是运营商也可以自由地处理任何明确的事情(例如1..*) - 但是如果他们不这样做,那么Whatever操作数会将操作转换为“准备好的”操作。闭合。