2012-01-19 26 views
8

我定義了兩個記錄類型:兩個領域有相同的標籤OCaml中

type name = 
    { r0: int; r1: int; c0: int; c1: int; 
     typ: dtype; 
     uid: uid (* key *) } 

and func = 
    { name: string; 
     typ: dtype; 
     params: var list; 
     body: block } 

而且我得到了一個錯誤之後的一行代碼:Error: The record field label typ belongs to the type Syntax.func but is mixed here with labels of type Syntax.name

誰能告訴我,如果我們不應該有兩個記錄中的兩個字段具有相同的標籤,如typ,這會使編譯器感到困惑。

+2

更新:自OCaml版本4.01.0以來,刪除了對唯一記錄字段標籤的要求。 –

+0

@Str。我認爲只有名稱有不同的類型纔是真實的,這在這裏不適用。 – johnbakers

回答

13

不,你不能,因爲它會打破類型推斷。

順便說一句,你可以使用模塊命名空間來解決這個問題:

let get_type r = r.Name.typ 
let name = { Name.r0=1; r1=2; ... } 
let f = { Func.name="foo"; typ=...; ... } 

請注意,您需要前綴:

module Name = struct 
    type t = { r0:int; ... } 
end 

module Func = struct 
    type t = { name: string; ... } 
end 

再後來,你可以通過正確的模塊前綴的字段名稱只有第一個字段,並且編譯器會自動理解您正在編寫的值的類型。

8

Ocaml語言要求模塊內的所有字段具有不同的名稱。否則,將無法推斷出以下功能

let get_typ r = r.typ ;; 

的類型,因爲它可能是name -> dtype類型或類型func -> dtype

BTW,我建議你有一個像後綴爲_t所有你的類型名稱。

+1

感謝您的評論......爲什麼您認爲最好爲類型名稱使用'_t'後綴? – SoftTimur

+1

只是一個可讀性的問題。我覺得'dtype'聽起來有些價值(例如某種功能)。 –

+0

@BasileStarynkevitch看到的類型和值的上下文總是已知的,當然沒有歧義? – Ashe