F#Coreが汎用配列型を定義するのはなぜですか?


11

FSharp.Core名前空間には、最大4次元の一般的な配列型、つまりCore。[] <'T>、Core。[、] <' T>などが含まれていることに気付きました。C#とVBはうまく機能しているようです。 System.Arrayを使用-int []、string []などの厳密に型指定された特殊な配列型をどのようにサポートするかは明確ではありませんが。

私はこれが2つの質問になると思う:

  • C#は、非ジェネリックSystem.Arrayに基づくint []のような厳密に型指定された特殊な配列型をどのようにサポートしますか?
  • C#がこれをなんとかしているのに、なぜF#は汎用配列型を定義するのですか?

回答:


8

F#は、それ自体は汎用の配列型を定義しません。F#の配列は、残りの.NETが使用する配列タイプと同じであり、反対のすべての構文的証拠があるにもかかわらず、一般的ではありません。

これは、F#でリフレクションを使用しているときに裏目に出ることがあります- array<int>完全に有効なジェネリック型であると思われる場合でも、検査するとfalse from IsGenericType、true from IsArray、およびtype引数を取得しますGetElementTypeいうしGetGenericArguments

Telastynが彼の答えで述べたように、これはおそらく、私たちが一緒に暮らさなければならない.NET 1.0のレガシー荷物です。しかし、F#でリフレクションAPIを実際の地雷原にする多くのことの1つにすぎません。

F#が定義しているのは、[], [,] ...型の略語/エイリアス/演算子、および対応する関数を備えたモジュールですが、これらはすべて、最終的には同じ配列型を参照します。

githubのソースコードをここここで見て、自分で確認できます。


ただし、これらはタイプエイリアスではなく、実際のタイプとしてリストされています。msdn.microsoft.com/en-us/library/dd233214.aspxが「すべてのF#配列の型は.NET Framework型の配列である」と言っているので混乱していますが、System.ArrayとFSharpの関係は何ですかコア汎用配列?
Asik

ジェネリック配列はありません;)それらは技術的には実際の型である可能性があり、それがmsdn doc generatorがそれらを選択した理由ですが、それらが定義するのは、正しく読み込む場合のコンパイラーによる展開方法です(最初にリンクしたファイル) 、および2番目のファイルのいくつかの拡張メソッド。これですべてです。それらのいずれかを作成し、GetTypeを呼び出します。System.Arrayに基づいた特殊な配列型になります。
scrwtp 14

むしろ、静的型自体はジェネリックですが、ラップしているランタイム配列型はジェネリックではありません。そのように型推論を実装する方が少し簡単かもしれませんが、それは大した推測ではありません。
scrwtp 14

5

C#は、非ジェネリックSystem.Arrayに基づくint []のような厳密に型指定された特殊な配列型をどのようにサポートしますか?

非常に可能性が高いのは、System.Arrayジェネリックが1.0で利用できなかったため、継承する特殊なクラスを生成することです。この動作は互換性のために維持されている可能性があります。

C#がこれをなんとかしているのに、なぜF#は汎用配列型を定義するのですか?

F#には、C#2.0が既存のコードで持っていたものと同じ互換性の制約がなかったからです。私が知っていることを基にすると、C#2.0がC#の最初のリリースであれば、汎用の配列型を持っていたでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.