19

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

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

除了将p1的表达式括在括号中之外,有没有办法解决types of rules don't agree由于尝试将e11p2进行模式匹配而导致的错误?p2模式有另一个 case 语句,以避免“只是切换模式”的答案;-)。

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

4

3 回答 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 )

这真的有效!酷:) 你也可以试试。

于 2014-10-18T18:05:42.693 回答
10

不可以。标准 ML 定义中的句法规则规定 case 表达式的匹配臂试图最大限度地消耗潜在的子句。而且由于语言中没有“结束案例”或类似的标记,解析器会愉快地吃掉你输入的每个“| pat => exp”子句,直到它看到终止匹配子句列表的内容。

于 2013-02-05T20:44:22.350 回答
4

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

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

于 2013-02-05T15:28:47.627 回答