在Perl 6世界中,currying是一个通用术语,表示部分实例化,并且在(参数化的)角色世界中也使用它。
但是,尚不清楚如何实际使用它:
role Zipi[::T] {};
class Zape does Zipi[::T] {}
Run Code Online (Sandbox Code Playgroud)
错误No such symbol T; 如果只T在声明类时使用,也是如此,但在这种情况下为Undeclared name。消除方括号及其内容产生率No appropriate parametric role variant available for 'Zipi',与将方括号留空相同。似乎有一个(有点)错误报告可以追溯到2012年,当然这些示例直接取自CurriedRolehow的源代码。是否知道这最终将如何工作,或者是否仅通过实例化某些参数就可以治愈参数化角色?
Jon*_*ton 10
例如,CurriedRoleHOW元类代表一个角色,该角色R已被赋予了一些参数集R[Int,Str]。从某种意义上说,角色总是具有一个隐式的第一个参数,这是它最终要构成的类,因此它保留了R和Int,Str参数,然后在实例化角色时将它们注入(构图时间) )。
当然不能写:
class Zape does Zipi[::T] {}
Run Code Online (Sandbox Code Playgroud)
并期望它做任何合理的事情;::T是一个类型捕获,因此只能输入签名。在这里,它被用作实例化角色的参数,并且受到了抱怨。此外,一个class是始终一个具体的东西,而不是一个普通的事情。
但是,可以使用类型变量来管理角色,以便稍后实例化。给定一个具有两个类型参数的角色:
role RA[::T, ::U] {
method t { T }
method u { U }
}
Run Code Online (Sandbox Code Playgroud)
我们可以编写另一个角色来修复一个角色并传递另一个角色:
role RB[::T] does RA[T, Int] { }
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
class C does RB[Str] { }
say C.t;
say C.u;
Run Code Online (Sandbox Code Playgroud)
具有以下输出:
(Str)
(Int)
Run Code Online (Sandbox Code Playgroud)
在此示例中,RA[T, Int]也由CurriedRoleHOW元类建模,但这次它具有空洞T和隐式::?CLASS,我相信可以实现您所要求的。
jnthn的回答是权威的。在他们回答之前,我已经开始进行此操作,并觉得我最好将其发布如下。
在Perl 6世界中,currying是一个通用术语,表示部分实例化,并且在(参数化的)角色世界中也使用它。
以下是非常重要的一点,至少在某些内部Rakudo标识符和官方P6文档中,这艘船似乎离港口很远,但我想指出这些年来,最近一次是在2017年,Larry似乎试图促使人们不要这样使用“咖喱”。
目前尚不清楚如何实际使用它:
role Zipi[::T] {}
class Zape does Zipi[::T] {}
Run Code Online (Sandbox Code Playgroud)
第一行是一个声明 -与-相似sub Zipi(::T) {}-因此它::T用作参数。
第二行是一个调用 -与-相似Zipi(::T)-因此它::T用作参数。
似乎有一个(错误)错误报告可以追溯到2012年
一对“角色”的搜索RT的不显示任何悬而未决的问题提作者的打滑“。
这些示例直接取自CurriedRolehow的源代码
我在该文件中看不到... does role[::T]带有捕获类型的公式::T。我错过了您的意思,或者这只是在声明与调用之间有些混淆,因为这does是在声明中执行“调用”。
有什么想法...如果仅通过实例化某些参数就可以治愈参数化角色?
是的,假设jnthn已正确理解您的问题。;)