2012-01-19 3 views
8

に同じラベルを持って、私は2つのレコードタイプ定義している:2つのフィールドの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

誰もがあれば教えてもらえ2つのレコードの2つのフィールドに同じラベルがあるはずはありません。これはtypのように、コンパイラを混乱させます。

+2

更新:OCamlバージョン4.01.0以降、一意のレコードフィールドラベルの要件が削除されました。 –

+0

@Str。名前が異なるタイプの場合にのみ当てはまると思いますが、ここでは該当しません。 – johnbakers

答えて

13

いいえ、型推論を破るため、できません。

ところで、あなたはそれを修正するモジュールの名前空間を使用することができます。

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

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

そしてその後、あなたは右のモジュールでフィールド名の前に付けることができます:あなたがプレフィックスする必要が

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

注意最初のフィールドのみであり、コンパイラは自動的にあなたが書いている値の型を理解します。

8

Ocaml言語では、モジュール内のすべてのフィールドに異なる名前が必要です。それはところで、私はあなたがのために_tのようなサフィックスを持つことが示唆タイプname -> dtypeまたはタイプのfunc -> dtype

のものであってもよいので、それ以外の場合は、以下の機能の種類

let get_typ r = r.typ ;; 

を推測することはできませんすべてのあなたのタイプ名。

+1

あなたのコメントありがとう...タイプ名に '_t'のような接尾辞が付いている方がいいのはなぜだと思いますか? – SoftTimur

+1

わかりやすい質問です。私は 'dtype'はある価値のように聞こえると感じています(例えば、ある機能)。 –

+0

@BasileStarynkevitchタイプと値のコンテキストとして知られていることは常にわかりますが、あいまいさはありませんか? – Ashe

関連する問題