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之后进入。