角色错误 "currying"

Errors with role "currying"

在 Perl 6 的世界里,currying 是一个表示部分实例化的通用术语,它也被用于 (parametrized) roles 的世界。

但是具体如何使用还不清楚:

role Zipi[::T] {};
class Zape does Zipi[::T] {}

错误No such symbol T;如果我们在声明 class 时简单地使用 T 也是一样的,但在本例中它是 Undeclared name。消除方括号及其内容会产生 No appropriate parametric role variant available for 'Zipi',与将方括号留空相同。似乎有一个(有点)bug report going back to 2012, and of course these examples are taken directly from the source code of CurriedRolehow。 知道这最终将如何工作,或者是否可以通过仅实例化一些参数来 curry 参数化角色?

CurriedRoleHOW meta-class 表示一个角色,比方说 R,它已经被赋予了一些参数集,例如 R[Int,Str]。它是柯里化的,因为角色总是有一个隐含的第一个参数,它是最终组成的 class,因此它包含 RInt,Str 参数,并且然后在角色实例化时注入它们(组合时间)。

肯定不会写:

class Zape does Zipi[::T] {}

并期望它做任何合理的事情; ::T 是类型 capture,因此只能在签名中使用。在这里,它被用作实例化角色的参数,并且受到了正确的抱怨。此外,class总是具体的事物,而不是一般的事物。

但是,可以使用类型变量对角色进行柯里化,以便稍后实例化。给定一个具有两个类型参数的角色:

role RA[::T, ::U] {
    method t { T }
    method u { U }
}

我们可以编写另一个角色来修复一个并传递另一个:

role RB[::T] does RA[T, Int] { }

然后像这样使用它:

class C does RB[Str] { }
say C.t;
say C.u;

其中有输出:

(Str)
(Int)

在此示例中,RA[T, Int] 也由 CurriedRoleHOW 元class 建模,除了这次它有洞 T 以及隐式 ::?CLASS,我相信这会达到您的要求。

jnthn的回答很权威。我在他们回答之前就开始了这个,我觉得我也可以 post 下面的一些内容。

In the Perl 6 world, currying is an universal term indicating partial instantiation, and it's also used in the world of (parametrized) roles.

以下是一个非常小的问题,现在看来船离港口很远,至少在一些内部 Rakudo 标识符和官方 P6 文档中是这样,但我想指出多年来,最近一次是在 2017 年 Larry has seemed to try to nudge folk to not use "currying" this way.

it's not clear how to actually use it:

role Zipi[::T] {}
class Zape does Zipi[::T] {}

第一行是一个声明——类似于sub Zipi(::T) {}——所以它使用::T作为parameter

第二行是 调用 -- 类似于 Zipi(::T) -- 所以它使用 ::T 作为 argument

There seems to be a (kinda) bug report going back to 2012

A search of rt for 'role' 没有显示提及作者 'skids' 的任何未决问题。

these examples are taken directly from the source code of CurriedRolehow

我在该文件中没有看到 ... does role[::T] 公式,其类型捕获 ::T。要么我没有理解你的意思,要么这只是关于声明与调用的一些混淆,因为这个 does 正在做一个 "call" 作为声明的一部分。

Any idea ... if it's possible to curry parametrized roles by instantiating only some of their parameters?

是的,假设 jnthn 已经正确理解了您的问题。 ;)