2015-10-23 126 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。隨着其他修復,一切工作正常。謝謝! –