Scala 等同于 Haskell 的模式匹配?

Scala's equivalent to Haskell's as-patterns in pattern matching?

提问人:matj1 提问时间:6/26/2023 更新时间:6/26/2023 访问量:70

问:

我在 Scala 中有一个长大小写,我使用了很大一部分。我可以命名大小写的部分,这样我就不必重写整个表达式了吗?

例:

x match {
    case (("def", symPos) :: defRest, defPos) :: rest =>
        val (defs, others) = split(rest)
        ((("def", symPos) :: defRest, defPos) :: defs, others)
    // …
}

该模式只是为了检测数据中的某种结构;我不需要操纵它的内部结构。如果我能参考整个事情,代码会更短、更清晰。(("def", symPos) :: defRest, defPos)

在 Haskell 中,我可以这样写:

case x of
    def@(("def", _) : _, _) : rest ->
        let (defs, others) = split rest
        in (def : defs, others)
    -- …

在这里,我命名了更大的模式,它允许我省略其内部的名称,仅使用名称将其放入列表中。我可以在 Scala 中做这样的事情吗?我什么也没找到。def

Scala Haskell 模式 匹配 As-pattern

评论

0赞 Gastón Schabas 6/26/2023
我不清楚您尝试模式匹配的结构是什么。它看起来像一个元组列表,但我不确定。你能添加要匹配的类的定义吗?
2赞 Tim Moore 6/26/2023
Scala 支持类似的语法 stackoverflow.com/q/2359014/29470
0赞 AminMal 6/26/2023
几乎一模一样,它在 Scala 中被称为“模式别名”。
0赞 matj1 6/26/2023
@TimMoore 为什么我在文档中找不到有关它的任何信息?
0赞 matj1 6/26/2023
@GastónSchabas 该示例已简化。原文在抽象语法树中查找顶级定义(以“def”开头)。我用元组替换了案例类,以使示例更简单。

答: 暂无答案