SML 中的嵌套 case 语句

问题描述 投票:0回答:3

这更多的是一个风格问题。给出以下代码:

case e1 of                    (* datatype type_of_e1  = p1 | p2 *)
    p1 => case e11 of         (* datatype type_of_e11 = NONE | SOME int *)
              NONE => expr11
            | SOME v => expr12 v
  | p2 => case e21 of         (* datatype type_of_e21 = NONE | SOME string *)
              NONE => expr21
            | SOME v => expr22 v

有没有办法解决由于尝试将

e11
模式匹配到 p2 而导致的 types of rules don't agree 错误,而不是将 p1 的表达式括在括号中? p2 模式有另一个 case 语句,以避免 “只需切换模式” 答案;-)。

更新:更改了代码以反映更具体的情况

coding-style sml
3个回答
19
投票

答案是“(”和“)”。例如:

case e1 of                   
   p1 => ( case e11 of         
              NONE => expr11
              | SOME v => expr12 v )
   | p2 => ( case e21 of         
                NONE => expr21
                | SOME v => expr22 v )

让我知道它是否也适合你


10
投票

不。标准 ML 定义中的句法规则指出,case 表达式的匹配臂尝试最大程度地消耗潜在子句。而且由于该语言中没有“结束情况”或类似的标记,因此解析器将愉快地吃掉您提供给它的每个“| pat => exp”子句,直到它看到终止匹配子句列表的内容为止。


4
投票

简单而简短的回答:不。但是括号有什么问题吗?

(当然,您也可以用其他方式括起来,例如使用“let”,或者分解为辅助函数,但括号是规范的解决方案。)

© www.soinside.com 2019 - 2024. All rights reserved.