6

perlgeek 上的这篇文章之后,它给出了一个柯里化的例子:

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]

4

1 回答 1

3

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

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

作为一种解决方法,使用

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

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

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

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

在函数调用的情况下,它作为参数传递,让被调用者决定它想用它做什么。甚至操作员也可以自由地显式处理 What (例如1..*)——但如果他们不这样做,那么 What 操作数会将操作转换为“准备好的”闭包。

于 2014-09-04T19:46:42.397 回答