Ошибки с ролью "карри" - PullRequest
       78

Ошибки с ролью "карри"

7 голосов
/ 13 апреля 2019

В мире Perl 6 curry - это универсальный термин, обозначающий частичную реализацию, и он также используется в мире (параметризованных) ролей .

Однако, не понятно, как на самом деле его использовать:

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 .Любая идея о том, как это в конечном итоге сработает или если возможно карри параметризованные роли путем создания экземпляров только некоторые из их параметров?

Ответы [ 2 ]

10 голосов
/ 13 апреля 2019

Метакласс CurriedRoleHOW представляет роль, скажем, R, которой был задан некоторый набор параметров, например R[Int,Str]. Он каррируется в том смысле, что роль всегда имеет неявный первый параметр, то есть класс, в который она в конечном итоге составлена, и поэтому она содержит аргументы R и Int,Str, а затем вводит их в тот момент, когда роль создается (время композиции).

Конечно, нельзя писать:

class Zape does Zipi[::T] {}

И ожидайте, что это сделает что-нибудь разумное; ::T является типом capture , поэтому может входить только в подписи. Здесь он используется в качестве аргумента для создания экземпляра роли, и на него справедливо жаловались. Кроме того, 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, которое, я считаю, достигает того, о чем вы просили.

5 голосов
/ 13 апреля 2019

jnthn ответ является авторитетным.Я начал это до того, как они ответили, и я чувствую, что могу также опубликовать некоторые из них следующим образом.

В мире Perl 6 curry - это универсальный термин, указывающий на частичную реализациюи он также используется в мире (параметризованных) ролей .

Следующее является очень незначительным моментом, и кажется, что лодка сейчас далеко от порта, по крайней мерев некоторых внутренних идентификаторах Rakudo и в официальном документе P6, но я хотел бы отметить, что на протяжении многих лет, совсем недавно, в 2017 году Ларри, похоже, пытался подтолкнуть народ к не использованию "карри""таким образом .

неясно, как на самом деле его использовать:

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

Первая строка - это объявление -- аналогично sub Zipi(::T) {} - поэтому он использует ::T в качестве параметра .

Вторая строка - call -аналогично Zipi(::T) - поэтому он использует ::T в качестве аргумента .

Кажется, что (вроде)g отчет за 2012 год

A поиск rt для 'role' не показывает открытых проблем с упоминанием автора 'skids'.

эти примеры взяты непосредственно из исходного кода CurriedRolehow

Я не вижу формулировку ... does role[::T] с типом захвата ::T в этом файле.Либо я пропускаю то, что вы имеете в виду, либо это было лишь небольшим замешательством в связи с объявлением против вызова, учитывая, что этот does выполнял "вызов" как часть объявления.

Любая идея... если возможно карри параметризованных ролей путем создания экземпляров только некоторых из их параметров?

Да, если предположить, что jnthn правильно понял ваш вопрос.;)

...