这更多的是一个风格问题。给出以下代码:
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 语句,以避免 “只需切换模式” 答案;-)。
更新:更改了代码以反映更具体的情况
答案是“(”和“)”。例如:
case e1 of
p1 => ( case e11 of
NONE => expr11
| SOME v => expr12 v )
| p2 => ( case e21 of
NONE => expr21
| SOME v => expr22 v )
让我知道它是否也适合你
不。标准 ML 定义中的句法规则指出,case 表达式的匹配臂尝试最大程度地消耗潜在子句。而且由于该语言中没有“结束情况”或类似的标记,因此解析器将愉快地吃掉您提供给它的每个“| pat => exp”子句,直到它看到终止匹配子句列表的内容为止。
简单而简短的回答:不。但是括号有什么问题吗?
(当然,您也可以用其他方式括起来,例如使用“let”,或者分解为辅助函数,但括号是规范的解决方案。)