2017-02-21 100 views
0

我有這個非常簡單的遞歸函數,從char列表中向樹添加分支。如何傳遞遞歸函數的值而不是定義

type tree = Node of bool ref * (char * tree) list ref 

let rec create_branch lc = function 
    [] -> Node(ref true, ref[]) 
    | x :: l -> Node(ref false, ref [(x, (create_branch l))]) 

我希望它可以創建只包含一個分支樹,這將有炭過渡一堆「假」節點,直到這將是真正的最後一個節點。

但我發現了一個錯誤:

錯誤:此表達式類型(的char *(字符列表 - >樹))列表裁判 而是一種表達預計的類型(字符*樹)名單REF 類型字符列表 - >樹與類型樹不兼容

我想我明白,這意味着我的遞歸調用似乎,由於某種原因,被傳遞爲實際函數的引用(因此(char列表 - > tree)),而不是它的返回值,它只是一棵樹。

我想知道我在做什麼錯?

回答

3

function關鍵字創建一個lambda表達式,其中您可以執行模式匹配的多個子句。

你寫的函數有兩個參數,lc和一個模式匹配。

您可以用match lc with替換function,或者刪除lc來修復它。

這是與 Ocaml: This expression has type 'a list * 'a list -> bool but an expression was expected of type bool相同的問題,但我知道搜索這樣的錯誤可能很困難。

+0

它的工作,或至少它解決了我的類型問題。爲了使實際的代碼工作可能仍然是一大堆工作,但你幫了很大忙。謝謝。 OCaml非常奇怪。 –