ocaml的二进制参考树查找

时间:2015-10-23 04:57:31

标签: ocaml binary-tree

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。

有谁能告诉我为什么会收到错误?

1 个答案:

答案 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

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

因此,您使用e1时存在类型冲突。