【发布时间】:2021-04-07 01:14:49
【问题描述】:
在 sml 中,我可以在 let 中使用元组吗?如果是这样,语法是什么?
我可以要求这是同心模式匹配,但似乎应该有一个更少的样板方式。在下面的let 中,我想将v1 和v2 绑定到调用interpExp 返回的元组的两个值。然后我想用其中一个值调用interpExp 以获得另外两个值。
fun performOp (e1,op,e2,table) =
let val (v1,t1) = interpExp(e1,table) (* interpExp returns 2-tuple, bind v1 and t2 to those two values *)
and val (v2,t2) = interpExp(e1,t1) (* use t1 which was bound on previous line *)
and val v3 = (case op of
Plus => v1 + v2
| Minus => v1 - v2
| Times => v1 * v2
| Div => v1 / v2)
in (v3,t2)
end
在进一步的试验和错误中,似乎第二个和第三个val 是不必要的,此后v1 和v2 似乎不在下一个条款的范围内。
fun performOp (e1,op,e2,table) =
let val (v1,t1) = interpExp(e1,table)
and (v2,t2) = interpExp(e1,t1) (* oops t1, not in scope *)
and v3 = (case op of
Plus => v1 + v2
| Minus => v1 - v2
| Times => v1 * v2
| Div => v1 / v2)
in (v3,t2)
end
在进一步的实验中,我发现了另一种语法,但我不确定有什么区别,即在let 中使用val 而不是and。
fun performOp (e1,op,e2,table) =
let val (v1,t1) = interpExp(e1,table)
val (v2,t2) = interpExp(e1,t1) (* oops t1, not in scope *)
val v3 = (case op of
Plus => v1 + v2
| Minus => v1 - v2
| Times => v1 * v2
| Div => v1 / v2)
in (v3,t2)
end
【问题讨论】:
标签: pattern-matching sml ml