2015-10-23 47 views
0
type exp = V of var 
      | P of var * exp 
and var = string 

我正在构建一个二进制引用树,其中右叶节点查找左叶节点上的叶节点,并且如果所有右叶节点都与某些左叶节点相匹配,则返回true 。ocaml的二进制引用树查找

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 

它告诉我,应该有型无功=字符串代替E1的一次。

谁能告诉我,为什么它得到的错误?

回答

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,它说,e1exp类型。在函数结束时,你有这样的:

| V x -> e1 = x 

由于xV构造函数的值,它必须是一个字符串。但随后e1 = x才有意义,如果e1是一个字符串也。

所以,我们在您使用的e1一个类型的冲突。

+0

感谢大家的回答杰弗里!我对这个函数的类型有麻烦。它应该是var * exp - > bool。随着其他修复,一切工作正常。谢谢! –