38

この質問はから始まりました

  1. LC PAULSON による " ML for the Working Programmer " ( WorldCat ) を、例にファンクターを使用する F# に翻訳しました。
  2. ファンクターを使用する Chris Okasaki による " Purely Functional Data Structures " ( WorldCat )を最終的に翻訳したいという願望。
  3. Andrea Asperti と Giuseppe Longo による 「CATEGORIES TYPES AND STRUCTURES - An Introduction to Category Theory for the working computer scientist」( WorldCat ) を読む。
  4. すべてを理解しているわけではなく、主に圏論です。

SML.NETはファンクターを実行でき、Microsoft .NET と連動します。
* 参照: SML.NET ユーザー ガイドセクション 4.8.2 クラス タイプとファンクター?

Microsoft .NET の制限により、F# が真のファンクターを実行できないことがよくわかります。
* ML ファンクターは .NET (C#/F#) で完全にエンコードできますか?
* functor の回避策はありますか?

では、SML.NET が .NET でファンクターを実行できるのであれば、なぜ F# で実行できないのでしょうか? SML.NET は、F# ができないことを何をしましたか?

圏論から派生したファンクターについて学べば学ぶほど、それらの美しさに気づき、F# で使用したいと思うようになります。

編集

圏論と関数型プログラミングの関係をよりよく理解するには、 CS:StackExchangeでこれらのQ&Aを参照してください。

4

1 に答える 1

41

F# でのファンクターの実装を妨げる .NET の基本的な制限はありません。確かに、それらを .NET メタデータで直接表現することはできませんが、ユニオン型などの他の F# 言語機能も表現できません。ファンクターを持つ言語 (例えば、Standard ML、OCaml) のコンパイラーには、defunctorizeと呼ばれるパスがあります。これは、ファンクターを通常のモジュールに特殊化することによってファンクターを「フラット化」するという点で、C++ テンプレート展開と同じように機能します。

F# コンパイラでも同じことを行うことができますが、その場合は、他の .NET 言語にどのように公開されるのでしょうか? ファンクターは .NET 型システムで直接エンコードできないため、それらを表現する何らかの方法を考え出す必要があります。その表現が C# または VB.NET から使用するのが難しい/不可能である場合、F# ファンクターを含めることは理にかなっていますか? F# の成功の重要な部分は、C# および VB.NET と (双方向で) 容易に相互運用できることです。

編集: 誤解しないでください -- F# にファンクターがあればいいのですが、ファンクターなしでは実装するのが現在面倒な、または不可能ないくつかのケースを処理するのに非常に役立ちます。私が指摘しているのは、この言語がまだファンクターを持っていない (そしておそらく今後も持たない) 主な理由は、相互運用の問題が解決されていないことです。メタデータのエンコードの問題は、実際には簡単な部分です。

EDIT 2: MLtonのdefunctorizeパスのコード:defunctorize.fun

更新: .NET 型システム内でファンクター実際に表現する方法について考えたので、ちょっとした実験をまとめました。きれいではありませんが、機能します。これで、F# がいずれファンクターをサポートできるようになる可能性が少なくとももっともらしいことがわかりました。実際には、私の実験的なコードで見られる複雑さはすべて、コンパイラ/言語によって隠されています。確認したい場合:experimental-functors

于 2013-02-08T17:09:27.917 に答える