SML中的嵌套case语句

时间:2013-02-05 13:32:33

标签: coding-style sml

这更像是一个风格问题而不是其他任何问题。鉴于以下代码:

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语句,以避免'只是切换模式'的答案; - )。

更新:更改了代码以反映更具体的案例

3 个答案:

答案 0 :(得分:13)

答案是"("和")"。我的例子:

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

这确实有效!很酷:)你也可以试试。

答案 1 :(得分:7)

没有。标准ML的定义中的句法规则表明案例表达式的匹配臂试图最大限度地消耗潜在的子句。而且因为没有"结束案例"或者语言中的类似标记,解析器会愉快地吃掉每个" | pat => EXP"您提供的子句,直到它看到终止匹配子句列表的内容。

答案 2 :(得分:3)

简单回答:不。但括号有什么问题?

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