【问题标题】:How to name a constraint如何命名约束
【发布时间】:2019-12-13 13:32:38
【问题描述】:

我有一个接受 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])

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

如果要使用多个 sub 进行编码,则将提供带有错误消息的默认 sub。但是对于内联尖点??

【问题讨论】:

  • 约束希望在{ 0 &lt;= all($_) &lt;= 255 } 的位置,否则它正在检查数组的长度。 (而且....我不知道...我尝试了一些东西,但没有任何效果)
  • @Scimon。好决定。新编辑的问题。最初,我没有包含 .all。不需要您的建议中的括号。

标签: constraints raku named


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你想要的是subset

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

    【讨论】:

    • 不幸的是,子集无法在 slurpy 数组上工作。
    • 在 REPL 中尝试了您的代码。得到:不支持具有类型约束的 Slurpy 位置参数。
    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2011-05-18
    • 2020-03-24
    • 2023-03-31
    相关资源
    最近更新 更多