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

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

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

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 ответа

Решение

CurriedRoleHOW метакласс представляет собой роль, скажем, R, которому был задан некоторый набор параметров, например R[Int,Str], Он каррируется в том смысле, что роль всегда имеет неявный первый параметр, то есть класс, в который она в конечном итоге входит, и поэтому она содержит R и Int,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Я считаю, что добивается того, о чем вы просили.

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

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

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

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

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

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

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

Похоже, что (вроде) отчет об ошибках, начиная с 2012 года

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

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

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

Есть идеи... можно ли каррировать параметризованные роли, создавая только некоторые из их параметров?

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

Другие вопросы по тегам