2017-04-17 4 views
1

私はOCamlのにかなり新しいんだけど、次のような型宣言が可能であるならば、私は興味があった:OCamlの入れ子構造

type some_type = { 
    list_of_things: { 
    amount: integer; 
    date: string; 
    } list; 
};; 

私は私が何か間違ったことをやっていると確信しているが、ちょうどに望んでいました知っている。ありがとう!

type transaction = { 
    amount: integer; 
    date: string; 
    } 

type some_type = { 
    list_of_things: transaction list; 
} 

一つの理由は、OCamlの型システムは、(対象システムとモジュールシステムの外に)公称であることである:

答えて

5

ネストされた構造は、しかしながら、レコードタイプが使用される前に定義する必要があり、完全に可能であるタイプでありますその内容によってではなく、名前によって定義されます。その結果、リストlist_of_thingsの要素の型を定義する必要があります。どこかで名前を挙げた。

それは相互再帰的なレコードを定義することも完全に可能である:OCamlの4.03以降で

type transaction = { 
    amount: integer; 
    date: string; 
    other: some_type 
    } 

and some_type = { 
    list_of_things: transaction list; 
} 

を、例えば、和タイプの定義内にインラインレコード型を定義することも可能である:

type tree = Leaf | Node of { left:tree; right:tree} 

しかし、インライン化されたレコードは完全にファーストクラスではなく、適切な名前がないため、コンストラクタのコンテキスト外では使用できません。

+0

これは私が探していたものです。ありがとうございます! – Jay

関連する問題