gpt4 book ai didi

pattern-matching - Raku 能否保证模式匹配是详尽的(在编译时)?

转载 作者:行者123 更新时间:2023-12-03 16:10:42 25 4
gpt4 key购买 nike

考虑以下玩具代码:

my $age-check = do given 18 { 
when $_ > 18 { 'old enough' }
when $_ < 18 { 'too young' }
};

say "The user is $age-check" # OUTPUT: «The user is False»
此代码包含导致运行时错误的错误(不处理输入正好为 18 的情况)。有没有办法在编译时通过要求 given 来捕获此错误?阻止详尽匹配?似乎应该有一种方法可以使用 CHECK移相器或类似的东西要求匹配是详尽的,但我不太确定我将如何去做。
(我知道您可以在运行时更早地发现错误,并使用引发错误的 default 案例,但这不是我要问的问题。如果 Raku 没有办法在编译时强制执行详尽匹配,那不是该语言的一个很大的缺点——但它可能是一个有用的特性。)

最佳答案

虽然您可以编写一个模块来通过处理给定的语句来强制执行这些内容(尤其是在 RakuAST 出现时),但这将非常棘手,并且实际上只能用于基本的数值运算。given 的语义/when基本上是

given $foo {         # topicalize $foo
when $bar1 { … } # if $foo ~~ $bar1
when $bar2 { … } # elsif $foo ~~ $bar2
when $bar3 { … } # elsif $foo ~~ $bar3
default { … } # else
}
如果您的条件很复杂,例如 .is-prime* %% 2 ,甚至是非确定性的(针对可变对象的智能匹配),很难或不可能确定。
如果您想对某些条件子集强制执行此级别的严格行为,您可以执行类似于以下的解决方法:
sub is-exhaustive(@conditions) { 
... # complex algorithm to determine that the conditions are exhaustive
}

my %foo =
less-than-eighteen => * < 18,
more-than-eighteen => * > 18,
exactly-eighteen => * == 18;

CHECK die unless is-exhaustive %foo.values;

given $bar {
when %foo<less-than-eighteen> { ... }
when %foo<more-than-eighteen> { ... }
when %foo<exactly-eighteen> { ... }
}

关于pattern-matching - Raku 能否保证模式匹配是详尽的(在编译时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63468882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com