F#などの言語では、他のほとんどの.NET言語との直接の相互運用が可能です。たとえば、C#で記述されたクラスをF#で直接使用したり、C#から直接F#コードを呼び出したりすることができます。
F#では、モジュールは、静的クラスに対応するCIL命令、クラス階層へのADT(抽象クラス+サブクラス)などにコンパイルされます。これにより、相互運用が容易になりますが、言語機能にいくつかの制限があります。
たとえば、F#はOCamlやSMLのような高次モジュール(または型クラスなどの「類似した」メカニズム)をサポートしていません。これが重要であるかどうかは主観的ですが、それはポリモーフィックコードを書くためのオプションを制限します(OO言語の一部を使用せずに)。
もちろん、代替手段は言語の主要部分の相互運用性の問題を無視せず、特定の相互運用性インターフェースを作成します。これは一方向または双方向です。
たとえば、F#のような言語では、代替設計は次のようになります。
これにはいくつかのケースで少し作業が必要になりますが、私の経験では、F#ライブラリをC#で使用する場合、ほとんどの人がOOラッパーを設計することになると思います。
F#ライブラリにOOラッパーがない場合でも、自分で作成することは可能です(F#では明らかに)。
より極端な場合、このインターフェイスは双方向であり、F#は一部のインターフェイスを介して.NETクラスにしかアクセスできませんが、この場合、このような制限を課す理由はほとんどありません。しかし、他の言語については、それはオプションかもしれません-例えば、あなたが純粋な言語かそのような何かを書きたかったなら。
問題の1つは、モデルへのプログラミングです。もう1つの問題は、マシンへのプログラミングです。したがって、モデルにプログラミングして、あらゆる種類の特別な機能を維持する中間コンパイルを作成できます。その場合、中間体はマシンをプログラムするものである必要があります。マシンの理解を拡張したり、コードの実行内容をダウングレードしたりするための互換性を提供するサポートライブラリが提供される追加のコードが存在する場合があります。
C#からの関数コードを無視しても、F#は改善されません。 F#は現在、機能強化されたOcaml(ただし.Netエコシステム用)と同様のスタイルでモデル化しており、ランタイムとタイプシステムを操作するF#の状況です。そのランタイムで表現できるものを拡張すると、すべての言語にメリットがあります。
デリゲートは実行の単位を具体化するために使用される1つのメソッドクラスのように設計されているため、C#のラムダ関数のようなものは既に薄くラップされています。 F#は、静的メソッドを含むクラスと同様にモジュールを使用します。これはすべて無料です。
ある言語を別の言語から切り離すことは不可能ではありません。言語の相互運用を困難にすることは現実的ではありません。その理由は、ランタイムを拡張して改善し、より多くの言語を許可し、クロスライブラリの使用を促進することです。特にC#では、型システムに公開された適切な値を使用できる場合に呼び出すことができるライブラリに制限はありません。コードは安全でなく、そのようにマークされる可能性があります。 (おそらく将来の機能によって)コードを高度なものとしてマークし、ILで実行できるより多くのことを実行できるようにすることができます。
チェックのコードベースを管理してコンパイラとジェネレータの追加機能をサポートする問題は、見つかったいくつかの有用なコードパターンを具体化することです。したがって、タイプがジェネリックである場合、コンパイラーは解決可能な可能性であるすべての種類のすべてのタイプのバージョン、または使用に基づく遅延ジッタージェネレーターを生成します。次に、種類が考慮されることを保証するものについて考えますか?使用法または含まれるスコープのテーブルルックアップだけですか?
簡単な答えは時間と欲望です。外部の影響力が問題や時間についてのさまざまな意見を表明しているため、それらの問題に自分自身が割り当てられているため、オプションを検討することは主要な著者の注意を引くようになります。 usersvoiceサイトが役立ちます。私自身は、何をどのようにコードを書くかを超えて拡張する衛生的なマクロに関心があります。ありがとうございました。良い一日。