在Perl 6世界中,currying是一个通用术语,表示部分实例化,它也用于(parametrized) roles世界。
但是,目前尚不清楚如何实际使用它:
role Zipi[::T] {};
class Zape does Zipi[::T] {}
No such symbol T
的错误;同样,如果我们在声明类时简单地使用T
,但在这种情况下它是Undeclared name
。消除方括号及其内容会产生No appropriate parametric role variant available for 'Zipi'
,就像将方括号留空一样。似乎有(有点)bug report going back to 2012,当然这些例子直接来自the source code of CurriedRolehow。知道这最终会如何工作,或者是否可以通过仅实例化一些参数来讨论参数化角色?
CurriedRoleHOW
元类代表了一个角色,比如R
,它已被赋予一些参数,例如R[Int,Str]
。从某种意义上来说,角色总是有一个隐含的第一个参数,它最终是由它组成的类,因此它保存了R
和Int,Str
参数,然后在实例化角色时注入它们(组成时间)。
一个当然不能写:
class Zape does Zipi[::T] {}
期望它做任何合理的事情; ::T
是一种类型捕获,因此只能签名。在这里,它被用作实例化角色的参数,并且被正确地抱怨。此外,class
总是具体的东西,而不是一般的东西。
但是,角色可以使用类型变量进行curry,以便稍后进行实例化。给定两个类型参数的角色:
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
,我相信这是你所要求的。
jnthn的回答是权威的。我在他们回答之前就已经开始这样做了,我觉得我可以发布一些如下内容。
在Perl 6世界中,currying是一个通用术语,表示部分实例化,它也用于(parametrized) roles世界。
以下是一个非常小的一点,看起来这艘船现在远离港口,至少在一些内部Rakudo标识符和官方P6文档中,但我想注意多年来,最近在2017年Larry has seemed to try to nudge folk to not use "currying" this way 。
目前尚不清楚如何实际使用它:
role Zipi[::T] {}
class Zape does Zipi[::T] {}
第一行是一个声明 - 类似于sub Zipi(::T) {}
- 所以它使用::T
作为parameter。
第二行是一个调用 - 类似于Zipi(::T)
- 所以它使用::T
作为argument。
似乎有一个(有点)错误报告可以追溯到2012年
search of rt for 'role'没有显示提及作者'滑行'的任何未解决的问题。
我没有在该文件中看到... does role[::T]
公式,其中包含捕获::T
的类型。要么我错过了你的意思,要么这只是对声明与调用的混淆,因为这个does
正在做一个“召唤”作为声明的一部分。
任何想法......如果可以通过仅实例化一些参数来讨论参数化角色?
是的,假设jnthn正确理解了你的问题。 ;)