2011-10-27 15 views
5

で定義されています。モジュール外でオープンユニオンを使用している場合は、

module Account = struct 

type account_type = Current of float | Savings of float 

end 

let sarah = Account.Current 100.0;; 

最後の行ではError: syntax errorが生成されますが、

module Account = struct 

    type 'a account_type = [> `Current of float | `Savings of float ] as 'a 

end 

let pete = Account.`Current 100.0;; 

つまり、モジュールを開くことなくモジュール外にオープンユニオンタイプを使用できないのはなぜですか?私は私が見つけたと言うべきであるに最後の行を変更:

open Account;; 
let pete = `Current 100.0;; 

が正常に動作しますが、私は多くのことをaccount_type使用している場合、明らかにこれは厄介であるか、あるいは私は、任意のコードの先頭にAccountを開く必要がありますここではaccount_typeが使用されています。つまり、署名を使用して抽象化を犠牲にすることを意味します。Account
INRIAのドキュメントとOCamlのチュートリアルをいくつか調べました。どのようにこれを行う。
account_typeを使用するたびにモジュールを開く必要はありませんか? 2番目の例では、事前に

おかげで、

ザック

答えて

6

は、あなたが実際には全くopen Accountする必要はありません、構文はちょうど`Current 100.0です。多型バリアントタグは、特定の型には関与しません。 `Currentのタイプは[> `Current ]であり、これは(>)はタイプが少なくとも`Currentであることを意味し、それは関数が受け入れるタイプのサブセットであるため、うまくコンパイルされます。同じ名前のポリモーフィックバリアントを受け入れる多数の関数に同じ値を渡すことができます。もちろん、静的なタイプの情報が欠けていて、タイプミスや状況がかなり複雑になる可能性があります。

Code Reuse through polymorphic variantsについて、いくつかの利点と使用例について説明します。

5

`Currentのような多型変種定数は、整数定数と同様にグローバルに定義されています。 Accountモジュール内の整数10を参照すると、Account.10とは言わないでしょう。

これはポリモーフィックバリアントの強さ(および弱点)です(使用する前に10を定義する必要はありません)。

したがって、ヌルカロニ氏によれば、Accountモジュールを開いて`Currentにアクセスする必要はありません。

多型のバリアントは、整数とは異なり、(`Current 100.0のように)パラメータを取ることができます。しかし、パラメータの数と型は固定されておらず、コード内の別の場所の同じコンストラクタでも変わる可能性があります。それゆえ、複雑さはまた、ヌルカロニによって言及された。

[フォーマットノート:タイプライタースタイルのテキストに単一の逆引用符`を表示するには、二重引用符を使用してテキストを囲みます。これはテキスト内に単独のバッククォートを残します。または少なくともそれは私のために働いています。]

+0

ああ、私はバックティックでバックティックをエスケープしようとしたため、関係するすべての人に多大な混乱を引き起こしました。 – nlucaroni

関連する問題