2014-01-10 54 views
0

我有以下模塊簽名AOCaml的簽名依賴關係錯誤

module type A = 
sig 
    type exp = 
    Int of int 
    | Var of string 
end;; 

這我能爲了得到a.mlia.cmi文件進行編譯。但是,如果我定義B

module type B = 
sig 
    val compute : A.exp -> A.exp 
end;; 

運行ocamlc -i b.ml產生錯誤Unbound type constructor A.exp。這是爲什麼?

回答

1

OCaml爲您提供免費的外部模塊,對應於每個源文件。所以你正在定義一個名爲A.A的模塊類型。請注意,這是一個模塊類型,而不是一個模塊。

這可能是您的a.ml(如果你喜歡a.mli)應該只包含以下內容:

type exp = Int of int | Var of string 

的話可以參考從b.ml文件A.exp。

此外,請注意a.mli是源文件文件。如果你有一個a.mli文件,你需要編譯它來創建一個.cmi文件。

+0

是否有可能用簽名以某種方式做到這一點,但避免'A.A'?我試圖從一些我沒有源碼的代碼複製簽名,只有簽名。雖然你的方法適用於類似於上面的類型定義,但我不知道如何爲'val'做到這一點。 – bellpeace