【发布时间】:2021-04-06 04:17:30
【问题描述】:
我是 ML 的新手,我正在尝试找出模式匹配的语法。
有人可以帮我理解编译器错误,以及模式匹配AssignStm 的正确语法,同时将其第二个参数绑定到变量e 吗?
也许我正在尝试做的事情根本不受支持?我有一个 ADT 定义如下。
type id = string
datatype binop = Plus | Minus | Times | Div
datatype stm = CompoundStm of stm * stm
| AssignStm of id * exp
| PrintStm of exp list
and exp = IdExp of id
| NumExp of int
| OpExp of exp * binop * exp
| EseqExp of stm * exp
我正在尝试实现一个函数来计算给定语句中对print 的调用次数。
编译器抱怨
/Users/jimka/Repos/mciml/fig4.1.sml:15.60 Error: unbound variable or constructor: e
这是我的代码:
fun maxints(a,b) =
if a > b then a else b
fun maxargs PrintStm nil = 0
| maxargs PrintStm h::t = 1 + (maxargs printStm t )
| maxargs CompoundStm(a,b) = maxints(maxargs a, maxargs b)
| maxargs AssignStm(_,e: exp) = maxargs e (* the error is on this line *)
| maxargs IdExp = 0
| maxargs NumExp = 0
| maxargs OpExp(e1,_,e2) = maxints(maxargs e1, maxargs e2)
| maxargs EseqExp(s,e) = maxints(maxargs s, maxargs e)
触发错误的实际代码如下:
val prog =
CompoundStm(AssignStm("a",OpExp(NumExp 5, Plus, NumExp e)),
CompoundStm(AssignStm("b",
EseqExp(PrintStm[IdExp"a", OpExp(IdExp"a", Minus,
NumExp 1)],
OpExp(NumExp 10, Times IdExp"a"))),
PrintStm[IdExp "b"]))
maxargs prog
molbdnilo 建议如下。但我得到了同样的错误。
fun maxargs( PrintStm nil) = 0
| maxargs( PrintStm (h::t)) = 1 + maxints(maxargs(h), maxargs( PrintStm( t )))
| maxargs( CompoundStm (a,b)) = maxints(maxargs( a), maxargs( b))
| maxargs( AssignStm (_,e)) = maxargs( e)
| maxargs( IdExp (_)) = 0
| maxargs( NumExp (_)) = 0
| maxargs( OpExp (e1,_,e2)) = maxints(maxargs e1, maxargs e2)
| maxargs( EseqExp (s,e)) = maxints( maxargs(s), maxargs(e))
【问题讨论】:
标签: pattern-matching sml ml