我什么时候可以使用Whatever star?

问题描述 投票:6回答:1

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]

perl6 currying raku
1个回答
3
投票

您的Rakudo版本有些古老。如果要使用较新的cygwin版本,则可能必须自己编译。如果您使用Windows版本,可以get a binary from rakudo.org

就是说,当前版本也不会将* min 2转换为lambda,但从粗略的测试来看,似乎将*视为Inf。我的Perl6-fu太弱了,无法知道这是否符合规格或错误。

作为解决方法,请使用

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

请注意,*仅使用操作员而不是函数调用来自动执行货币(或者在Perl6-speak中使用“自动启动”-参见S02),即您的第三个示例应写为]]

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

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

[如果是函数调用,则将其作为参数传递,让被调用者决定要使用它做什么。即使是运算符,也可以自由地显式处理任何内容(例如1..*),但是如果不这样做,则Whatever操作数会将其转换为“带底的”闭包。

© www.soinside.com 2019 - 2024. All rights reserved.