t<'a>
と'a t
F#の意味に違いはありますか? 宣言後でも互換的に使用できますか?
4 に答える
違いはありません。はい、宣言後でも同じ意味で使用できます。
ただし、F# コンポーネント デザイン ガイドラインの推奨事項 (セクション 4.2)に注意してください。
4 つの注目すべき例外 ( 、 、 )を除いて、後置構文 ( ) よりもジェネリック (
Foo<T>
)の前置構文を使用することを検討してください。T Foo
list
option
array
ref
F# は、"<code>int list" などのジェネリック型の命名の後置 ML スタイルと、"<code>list<int>" などのプレフィックス .NET スタイルの両方を継承します。4 つの特定の型を除いて、.NET スタイルを優先する必要があります。F# リストの場合、「<code>list<int>」ではなく「<code>int list」という後置形式を使用します。オプションには、「<code>option<int>」ではなく「<code>int option」という後置形式を使用します。配列の場合、「<code>int array」または「<code>array<int>」ではなく、構文名「<code>int[]」を使用します。の場合
refs
、「<code>ref<int>」または「<code>Ref<int>」ではなく「<code>int ref」を使用します。他のすべてのタイプについては、プレフィックス形式を使用します: “<code>HashSet<int>”, “<code>Dictionary<string,int>”,
また、ML スタイルのジェネリック パラメーター リスト表記 ( ('a,'b) t
vs.など) を使用すると、コンパイラの警告が表示されますt<'a,'b>
。
また、同じガイドのセクション 3.1にある次の推奨事項に注意してください。
F# 向けのライブラリを含め、パブリック API の汎用パラメーター名には PascalCase を使用してください。特に、任意のジェネリック パラメータには T、U、T1、T2 などの名前を使用し、特定の名前が意味をなす場合は、F# 向けのライブラリには Key、Value、Arg などの名前を使用します (TKey などは使用しません)。
(個人的には、F# 向けのパブリック ライブラリに対するこの推奨事項を無視する傾向があります)。
まったく違いはありません。これが完全な回答に値するかどうかはわかりません! 複数の型パラメータに関しては、特に前者を好みます(後者でそれは可能ですか?)。
構文はより慣用的だと思い'a t
ます (ほとんどすべての MSDN の例で使用され、コンパイラによって出力され、署名ファイルの構文が生成されます)。
配列にも同様の例があります
int[] , int array
'a t
構文は、具体的なパラメーターの場合にも優れています-
int list, List<int>
したがって、いくつかの一貫性が主張します'a t
違いは読みやすさだと思います。1 つのパラメーターについては、'
構文がそれほど混乱することはありませんが、それらのリストを取得すると、山かっこバージョンの方がはるかに読みやすくなります。