type exp = V of var
| P of var * exp
and var = string
我正在构建一个二叉引用树,其中右叶节点查找左叶节点上的叶节点,如果所有正确的叶节点都与一些左叶节点匹配,则返回true。
let rec ctree : exp * exp -> bool
=fun (e1,e2) -> match e2 with
| P (x,y) -> match y with
| P (a,b) -> if (ctree(a,b)) then true else ctree(x,b)
| V a -> if a=x then true else ctree(e1,y)
| V x -> e1=x
但是在这里,我在第5行遇到错误:
| V a -> if a=x then true else ctree(e1,y)
这里的e1有一个exp类型,它应该是这样的,但编译器一直告诉我它应该是一个var = string类型。另外,对于第6行,
V x -> e1=x
它告诉我应该再输入var = string而不是e1。
有谁能告诉我为什么会收到错误?
答案 0 :(得分:0)
如果有两个嵌套的match
表达式,则不清楚嵌套的结束位置。你需要在内部匹配周围使用括号。这样的事情可能有用:
let rec ctree : exp * exp -> bool =
fun (e1,e2) -> match e2 with
| P (x,y) ->
(match y with
| P (a,b) -> if (ctree(a,b)) then true else ctree(x,b)
| V a -> if a=x then true else ctree(e1,y)
)
| V x -> e1=x
其次,该函数的类型为exp * exp -> bool
,表示e1
的类型为exp
。在功能结束时你有这个:
| V x -> e1 = x
由于x
是V
构造函数的值,因此它必须是字符串。但是e1 = x
只有e1
也是一个字符串才有意义。
因此,您使用e1
时存在类型冲突。