Как назвать ограничение

У меня есть функция, которая принимает нечеткий массив, и я хочу ограничить содержимое массива значением Int от 0 до 255. Поэтому, используя хорошую документацию raku, я обнаружил, что могу написать:

my &simp = -> *@a where { 0 <= $_.all <= 255 } { @a <<+>> 10 }
say &simp( 2, 3, 4);
# returns: [12 13 14] 

По желанию, если я укажу список, который не входит в диапазон, я правильно получаю сообщение об ошибке, а именно.

say &simp( 2,3,400 );
# Constraint type check failed in binding to parameter '@a'; expected anonymous constraint to be met but got Array ($[2, 3, 400])

Можно ли каким-то образом назвать ограничение, чтобы сообщение об ошибке могло дать лучший ответ?

Если бы это было закодировано с несколькими сабвуферами, то был бы предоставлен саб по умолчанию с сообщением об ошибке. Но для встроенного остроконечного ??


person Richard Hainsworth    schedule 13.12.2019    source источник
comment
Ограничение должно быть там, где { 0 <= all($_) <= 255 }, иначе оно проверяет длину массива. (И... я не знаю... я кое-что пробовал, ничего не получилось)   -  person Scimon Proctor    schedule 13.12.2019
comment
@Scimon. Хороший звонок. Новый отредактированный вопрос. Первоначально я не включал .all. Нет необходимости в скобках, как в вашем предложении.   -  person Richard Hainsworth    schedule 13.12.2019


Ответы (2)


Вы можете попытаться сгенерировать ошибку в предложении where с помощью || оператор.

my &simp = -> *@a where { (0 <= $_.all <= 255) || die 'not in Range' } { @a <<+>> 10 }
say &simp( 2, 3, 4);
# returns: [12 13 14]

say &simp( 2,3,400 );
#not in Range
person Valle Lukas    schedule 13.12.2019

Вам нужен подмножество.

subset ByteSizedInt of Int where { 0 <= $_ <= 255 };
my &simp = -> ByteSizedInt *@a { @a <<+>> 10 };
person Holli    schedule 13.12.2019
comment
К сожалению, подмножество не будет работать на грязном массиве. - person Scimon Proctor; 13.12.2019
comment
Попробовал ваш код в REPL. Got: Slurpy позиционные параметры с ограничениями типа не поддерживаются. - person Richard Hainsworth; 13.12.2019