type NewType = string * int
はタイプの略語と呼ばれるものです。別のタイプに名前やエイリアスを付けますが、コンパイル時に消去されます。カプセル化はなく、新しいリファレンスも基本的に新しいタイプもありません。
これはドキュメントとして機能しますが、F#のコンパイラは新しい名前とエイリアスタイプを同じものとして扱います。これは、NewType
を使用する公開関数/メソッドを持つDLLを作成し、別のプロジェクトから呼び出しようとすると特に見えます。あなたの場合のように混合結果が表示されます。
これは、達成したいことが読みやすくするためには問題ではないかもしれません。コード内にlet testFunction (arg1:NewType) : NewType = ...
が表示されている場合、特にIntelliSenseのツールチップがないGitHubのようなWeb上では、実際に「実際」のタイプがであっても、関数が受け取った戻り値がかなりわかります。
は、あなたがより良い型の安全性が必要な場合は、通常の練習は、シングルケースを定義しているあなたは、パターンは次のように一致して組み合わせることができ組合を区別:
type NewType = NewType of (string * int)
let testFunction (NewType arg1): NewType =
NewType ("resultString", 2)
testFunction (NewType ("test", 3))
あなたがよりここに読み、そしてからの他の記事にすることができますシリーズ:https://fsharpforfunandprofit.com/posts/type-abbreviations/
しかし、なぜ戻り値の型は "NewType"ですか、それは戻り値の型ではなく、引数では機能しません。ところでリンクのおかげで! – FraK
@FraK、これは良い質問です。それ以外の満足できる答えはわかりません。それはコンパイラの現在のバージョンがどうやってそれを行うのかです(例:https://github.com/fsharp/fsharp/issues/717)。 Tomasがきちんと書いたように、元の型とそのエイリアスはコンパイラ(と他のツーリング)のために互換性があり、どちらが見えるかは保証されません。 –
答えをありがとう – FraK