7

在 Perl 6 世界中,柯里化是一个通用术语,表示部分实例化,它也用于(参数化)角色的世界。

但是,尚不清楚如何实际使用它:

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

错误No such symbol T;如果我们T在声明类时简单地使用相同,但在这种情况下它是Undeclared name. 消除方括号及其内容产生No appropriate parametric role variant available for 'Zipi',与将方括号留空相同。似乎有一个(有点)错误报告可以追溯到 2012 年,当然这些示例直接取自CurriedRolehow 的源代码。知道这最终将如何工作,或者是否可以通过仅实例化角色的一些参数来咖喱参数化角色?

4

2 回答 2

10

CurriedRoleHOW类代表一个角色,比方说R,它已经被赋予了一些参数集,例如R[Int,Str]。柯里化的意思是角色总是有一个隐式的第一个参数,这是它最终组合到的类,因此它保存RInt,Str参数,然后在角色实例化时注入它们(组合时间)。

一个人当然不能写:

class Zape does Zipi[::T] {}

并期望它做任何合理的事情;::T是一种类型capture,因此只能进入签名。在这里,它被用作实例化角色的参数,并且被正确地抱怨。此外,aclass始终具体的事物,而不是一般的事物。

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

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元类建模,除了这次它具有孔T以及隐式::?CLASS,我相信这可以实现您的要求。

于 2019-04-13T12:17:12.467 回答
5

jnthn 的回答是权威的。我在他们回答之前就开始了,觉得我不妨将其中的一些内容发布如下。

在 Perl 6 世界中,柯里化是一个通用术语,表示部分实例化,它也用于(参数化)角色的世界。

以下是非常次要的一点,现在看来这艘船离港口很远,至少在一些内部 Rakudo 标识符和官方 P6 文档中,但我想指出,这些年来,最近一次是在 2017 年拉里似乎试图推动人们不要以这种方式使用“currying”

目前尚不清楚如何实际使用它:

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

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

第二行是一个调用——类似于Zipi(::T)——所以它::T用作一个参数

似乎有一个(有点)错误报告可以追溯到 2012 年

rt 中搜索“role”并没有显示任何提到作者“skids”的未解决问题。

这些示例直接取自CurriedRolehow 的源代码

我在该文件中没有看到... does role[::T]带有类型捕获的公式。::T要么我错过了你的意思,要么这只是声明与调用的一些混淆,因为这does是作为声明的一部分进行“调用”。

任何想法......是否可以通过仅实例化角色的一些参数来咖喱参数化角色?

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

于 2019-04-13T12:54:12.553 回答