Coding style SML中的嵌套case语句

Coding style SML中的嵌套case语句,coding-style,sml,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 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的表达式括在括号中之外,还有什么方法可以解决由于尝试模式匹配e11到p2而导致的
类型的规则不一致
错误?p2模式有另一个case语句,以避免“只需切换模式”答案;-)


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

简单明了的回答:没有。但是括号有什么问题吗


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

否。标准ML定义中的语法规则表明,大小写表达式的匹配臂试图最大限度地使用潜在子句。由于语言中没有“end case”或类似的标记,解析器将愉快地吃掉您提供给它的每个“|pat=>exp”子句,直到它看到终止匹配子句列表的内容。

答案是“(“And”)”。我的例子是:

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

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

什么是
e2
?你能提供一个完整的功能吗?这是一个错误,所以在担心编码风格之前最好先修复它。@pad:我已经更新了代码以消除混淆
e2
e11
的初始名称,已更改代码以添加
p2
的案例。我忘记了问题中对其名称的更改。我得到的唯一错误是,如果我没有将
p1
的表达式括在括号中。说到编码样式,让值构造函数以大写字母开头是一种很好的样式,以避免混淆它是一个变量。这里,我在谈论你的
p1
p2
。它们没有什么问题,我只是希望我错过了一个更优雅的解决这个问题的方法。对不起,我的代码太模糊了,我已经更新了。我的困惑源于这样一个事实,即
case
表达式确实消耗了所有可能的子句(
e11
选项
一些v
将覆盖所有情况,解析器除了结束
case
表达式外没有其他选项).@slash3r解析器不知道类型。类型检查阶段在解析器构造AST之后进入。