如何命名约束

How to name a constraint

我有一个接受 slurpy 数组的函数,我想将数组的内容限制为 0 到 255 之间的 Int。所以使用 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])

是否可以以某种方式命名约束,以便错误消息可以提供更好的响应?

如果要用多个子编码,则将提供一个带有错误消息的默认子。但是对于内联尖头 ??

你要的是subset.

subset ByteSizedInt of Int where { 0 <= $_ <= 255 };
my &simp = -> ByteSizedInt *@a { @a <<+>> 10 };

您可以尝试使用 || 运算符在 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