这更像是一个风格问题而不是其他任何问题。鉴于以下代码:
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语句,以避免'只是切换模式'的答案; - )。
更新:更改了代码以反映更具体的案例
答案 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',或者通过分解为辅助函数,但括号是规范的解决方案。)