角色为“ currying”的错误

时间:2019-04-13 07:44:04

标签: perl6 nqp

在Perl 6世界中, currying 是一个通用术语,表示部分实例化,并且在(parametrized) roles的世界中也使用过。

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

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

个错误;如果在声明类时仅使用No such symbol T,则相同,但是在这种情况下,它是T。消除方括号及其内容将产生Undeclared name,与将方括号留空一样。似乎有一个bug report going back to 2012,当然这些示例直接取自the source code of CurriedRolehow。 关于这将最终如何工作或者是否有可能仅通过实例化角色的某些参数来实现 curry 参数化角色的任何想法?

2 个答案:

答案 0 :(得分:10)

CurriedRoleHOW元类表示一个角色,比方说R,该角色已被赋予了一些参数集,例如R[Int,Str]。从某种意义上说,角色总是具有一个隐式的第一个参数,即它最终要构成的类,因此它持有RInt,Str参数,然后将它们插入实例化角色的时间(组成时间)。

当然不能写:

class Zape does Zipi[::T] {}

并期望它做任何合理的事情; ::T捕获类型,因此只能输入签名。在这里,它被用作实例化角色的参数,并且受到了抱怨。此外,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元类建模,除了这次它具有孔T和隐式::?CLASS相信您所要求的成就。

答案 1 :(得分:5)

jnthn的回答是权威性的。在他们回答之前,我已经开始进行此操作,并觉得我最好将其发布如下。

  

在Perl 6世界中, currying 是一个通用术语,表示部分实例化,并且在(parametrized) roles的世界中也使用过。

以下是一个非常小的要点,至少在某些内部Rakudo标识符和官方P6文档中,这艘船似乎离港口很远,但我想指出这些年来,最近一次在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

  

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

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

  

这些示例直接取自the source code of CurriedRolehow

在该文件中,我看不到... does role[::T]的类型与捕获::T的类型。要么我错过了您的意思,要么考虑到does正在进行“调用”作为声明的一部分,这对声明vs调用有点混乱。

  

任何想法...如果仅实例化某些参数,是否有可能使 curry 角色化?

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