角色“currying”的错误

问题描述 投票:7回答:2

在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。知道这最终会如何工作,或者是否可以通过仅实例化一些参数来讨论参数化角色?

perl6 nqp
2个回答
10
投票

CurriedRoleHOW元类代表了一个角色,比如R,它已被赋予一些参数,例如R[Int,Str]。从某种意义上来说,角色总是有一个隐含的第一个参数,它最终是由它组成的类,因此它保存了RInt,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,我相信这是你所要求的。


5
投票

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'没有显示提及作者'滑行'的任何未解决的问题。

这些例子直接来自the source code of CurriedRolehow

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

任何想法......如果可以通过仅实例化一些参数来讨论参数化角色?

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

© www.soinside.com 2019 - 2024. All rights reserved.