gpt4 book ai didi

Raku 中的类似 Haskell 的模式匹配

转载 作者:行者123 更新时间:2023-12-04 18:10:55 25 4
gpt4 key购买 nike

Haskell 和 Rust(以及我不知道的其他语言)有一个他们称之为“模式匹配”的特性。这是 Haskell 中的一个示例:

data Event = HoldKey Char | PressKey Char | Err String

someFunc = let
someEvent <- doSomeStuff
-- What follows is a case expression using pattern matching
thingINeed <- case someEvent of
HoldKey keySym -> process keySym
PressKey keySym -> process keySym
Err err -> exit err
in keepDoingStuff
Raku 中最接近这一点的似乎是 multimethods multifunctions(术语在下面的答案中固定,但 multimethods 也可以使用)。
class Hold  { has $.key; }
class Press { has $.key; }
class Err { has $.msg; }

multi process(Hold (:$key)) { say $key; }
multi process(Press (:$key)) { say $key; }
multi process(Err (:$msg)) { say $msg; }
但是,如果我想要一个“本地”模式匹配表达式(如上面 haskell 片段中的 case 表达式),这将无济于事。像这样的东西:
given Hold.new(:key<a>) {
when Hold (:$key) { say $key }
when Press (:$key) { say $key }
when Err (:$msg) { say $msg }
default { say "Unsupported" }
}
唉,不能编译。那么我是否遗漏了什么,或者 Raku 可以用其他方式表达这一点吗?

最佳答案

您正在尝试使用不需要签名的签名。
签名更有可能是 block 的一部分,所以它看起来更像这样:

given Hold.new(:key<a>) {
when Hold -> (:$key) { say $key }
when Press -> (:$key) { say $key }
when Err -> (:$msg) { say $msg }
default { say "Unsupported" }
}
这目前不起作用,因为 block 没有任何参数。
可以说,这将是一个有用的功能。

请注意, given 只有两件事做。
  • proceed 的 block 一样行动和 succeed最终确定。
  • 设置 $_到你给它的值(value)。

  • 这意味着 $_已设置为您要进行智能匹配的值。
    given Hold.new(:key<a>) {
    when Hold { say .key }
    when Press { say .key }
    when Err { say .msg }
    default { say "Unsupported" }
    }

    关于Raku 中的类似 Haskell 的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66233465/

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