Несоответствие подписи карты с Безотносительно?х против х против хх - PullRequest
0 голосов
/ 03 марта 2019

Последняя строка здесь приводит к неправильной подписи для вызова карты:

my @array=[0,1,2];
say "String Repetition";
say @array.map({($_ x 2)});
say @array.map: * x 2;

say "\nCross product ";
say @array.map({($_ X 2)});
say @array.map: * X 2;

say "\nList Repetition";
say @array.map({$_ xx 2});
say @array.map: * xx 2;

Вывод:

String Repetition
(00 11 22)
(00 11 22)

Cross product 
(((0 2)) ((1 2)) ((2 2)))
(((0 2)) ((1 2)) ((2 2)))

List Repetition
((0 0) (1 1) (2 2))
Cannot resolve caller map(Array:D: Seq:D); none of these signatures match:
    ($: Hash \h, *%_)
    (\SELF: █; :$label, :$item, *%_)

Оператор x возвращает Str, X возвращает aСписок списков и хх возвращают список.

Изменено ли это каким-либо образом с помощью чего угодно.Почему происходит эта ошибка?Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Оператор xx является «громоздким».

say( rand xx 2 );
# (0.7080396712923503 0.3938678220039854)

Обратите внимание, что rand был выполнен дважды.x и X этого не делают.

say( rand x 2 );
0.133525574759261740.13352557475926174

say( rand X 1,2 );
((0.2969453468495996 1) (0.2969453468495996 2))

То есть xx рассматривает каждую сторону как нечто вроде лямбды в отдельности.
("гром")

say (* + 1 xx 2);
# ({ ... } { ... })

say (* + 1 xx 2)».(5);
# (6 6)

Таким образом, вы получаете последовательность *, повторяемую дважды.

say (* xx 2).map: {.^name}
# (Whatever Whatever)

(Термин *, является примером чего угодно)


Это также означает, что вы не можете создать замыкание WhwhatCode с && / and, || / or, ^^ / xor или //.

say (* && 1);
# 1

Обратите внимание, что * также делает что-то другое в правой части xx.
Это создает бесконечную последовательность.

say ( 2 xx * ).head(20);
# (2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2)

Если xx не было «thunky », то это также привело бы к созданию лямбда-кода Wh WhirlCode.

0 голосов
/ 03 марта 2019

Дайте мне посмотреть, смогу ли я пройти через это ясно.Если нет, спросите.

Краткий ответ: xx имеет специальное значение вместе с Whatever, поэтому он не создает WhateverCode, как в остальных примерах.

Давайте посмотрим, смогу ли я получить это прямо с длинным ответом.

Во-первых, определения.* называется Whatever.Обычно он используется в ситуациях, когда он карри

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

Карри превращает его в WhateverCode.Таким образом, * сам по себе - это «Все, что угодно», * с некоторыми вещами - это «Что бы ни было», создавая блок из воздуха.

Однако это не происходит автоматически, потому что иногда нам нужно, чтобы «Все было просто, что угодно».У вас есть несколько исключений , перечисленных в Whatever документации .Один из них использует xx, потому что xx вместе с Whatever должны создавать бесконечные списки.

Но это не то, что я делаю, вы можете сказать.* - это перед числом для умножения.Ну да.Но этот код в Actions.nqp (который генерирует код из источника) ссылается на infix xx.Так что это на самом деле не имеет значения.

Итак, вернемся к краткому ответу: вы не можете всегда использовать * вместе с другими элементами для создания кода.Некоторые операторы, такие как тот, .. или ... будут иметь особое значение в непосредственной близости от *, поэтому вам нужно будет использовать что-то еще, например аргументы-заполнители.

...