2011-01-24 6 views
4

OCamlタイプは、私が読んでいるチュートリアル/マニュアルに関係なく、常に私を本当に混乱させました。Ocamlバリアントタイプ

フォームのいずれかを持つタイプ( 'a、' b)のテスト: 空、T t、N n、Seq [ x1 ... xn]

私は最初の3つの方法を知っていますが、最後のフォームを定義する方法は全くわかりません。

type ('nonterm, 'term) test = 
    | Empty 
    | T of 'term 
    | N of 'nonterm 
    | ???? 

は、配列のために、私はXNに部分式X1のインスタンスと一致する必要があります。これは私が持っているものです。 x = 0の場合、これは空です。誰でも私を助けてくれる?前もって感謝します。

+2

アッティカ - 私はあなたのように最初新しいユーザーです:Stackoverflowへようこそ!私はあなたがこれまでに質問したことに投票したり答えを受け入れなかったことに気付きました。あなたがまだ持っていない場合は、よくある質問を読んでください:http://stackoverflow.com/faq - 基本的に答えが気に入ったら投票してください。あなたの質問に十分答えたら、それを受け入れるべきです。 –

答えて

10

Seqのサブ式もテストしていますか?その場合、リストを使用することができます:

type ('nonterm, 'term) test = 
    | Empty 
    | T of 'term 
    | N of 'nonterm 
    | Seq of ('nonterm, 'term) test list 

リストはもちろん空でもかまいません。

+0

ありがとうマイケル!可能であれば、最後の行が何を意味するのか少し説明することも可能でしょうか? (私はOCamlの新機能であり、非常に役に立ちます)。 Seqのサブ式もテストですが、そうでないとどうなりますか? – Atticus

6

これは、マイケル・Eへのあなたのコメントへの答えです:

OCamlの変異体は、オプションの引数を持つコンストラクタで構成されています。 Michaelの答えの場合、コンストラクタはEmpty,T,NおよびSeqです。 Emptyは引数をとりません。T'termという汎用タイプをとり、N'nontermという汎用タイプを取ります(Seqを1秒で取得します)。バリアントタイプは('nonterm, 'term) testです。あなたがタイプ('nonterm, 'term) testの要素のリストをしたいとしましょう:

# [Empty; Empty];; 
- : ('a, 'b) test list = [Empty; Empty] 

あなたはタイプが('a, 'b) test listであることがわかります。 (OCamlはnontermaと置き換え、termbと置き換えましたが、あまり心配する必要はありません)。

| Seq of ('nonterm, 'term) test list('nonterm, 'term) testの要素のリストを引数として取るSeqというコンストラクターであることがわかりました。今、私たちはこれを行うことができます:

# Seq [Empty;Empty];; 
- : ('a, 'b) test = Seq [Empty; Empty]