【问题标题】:binary reference tree lookup for ocamlocaml 的二叉引用树查找
【发布时间】:2015-10-23 04:57:31
【问题描述】:
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。

谁能告诉我为什么会出现错误?

【问题讨论】:

    标签: ocaml binary-tree


    【解决方案1】:

    当您有两个嵌套的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 时存在类型冲突。

    【讨论】:

    • 感谢杰弗里的回答!我对函数的类型有疑问。它应该是 var * exp -> bool。连同其他修复程序,一切正常。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2012-06-05
    • 2011-04-12
    • 1970-01-01
    相关资源
    最近更新 更多