2013-02-08 7 views
32

は、この質問はもしSML.NETにファンクタがあれば、F#はできないのですか?

  1. 例についてはファンクタを使用してF#にL. C.ポールソンによる「ML for the Working Programmer」(WorldCat)の私の翻訳から始まりました。
  2. Purely Functional Data Structures」(WorldCat)はFunctorsを使用しているChris Okasakiによって翻訳されました。
  3. Andrea AspertiとGiuseppe Longoの "CATEGORIES TYPES AND STRUCTURES - An Introduction to Category Theory for the working computer scientist"(WorldCat)を読みます。
  4. それはすべて、ほとんどのカテゴリの理論を理解していない。

SML.NETは、Functorを実行してMicrosoft .NETで作業することができます。
*参照:SML.NET User Guideセクション4.8.2クラスの種類とファンクタ?

Microsoft .NETのいくつかの制限のために、F#が真のファンクタを実行できないことが分かります。
* Can ML functors be fully encoded in .NET (C#/F#)?
* Any workaround for functor?

SML.NETは、.NET上でファンクタを行うことがあれば、なぜないのF#ができますか? SML.NETはF#ではできないことは何ですか?

カテゴリ理論から来るファンクターについてもっと知るほど、私はそれらの美しさとF#での欲望を見ています。より良い圏論と関数型プログラミングとの関係を理解するための追求で

EDIT

CS:StackExchangeでこれらQ&Aを参照してください。

+0

人々はこの質問を見つめているので、興味のある論文を見つけるかもしれないので、このペーパーへのリンクを追加しています。 [Physics、Topology、Logic and Computation: A Rosetta Stone](http://arxiv.org/pdf/0903.0340v3.pdf) –

+0

興味のあるもの:[Higher Kindのジェネリックス](http://adriaanm.github。 io/files/higher.pdf)と[Scalaのより親切な型は何ですか?](http://stackoverflow.com/questions/6246719/what-is-a-higher-kinded-type-in​​-scala)と[F#に高次ジェネリックを追加 - (型クラス)](https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2228766-add-higher-order-generics-to-f-type- –

+0

興味深い:[F#でのグローバル演算子のオーバーロード](http://stackoverflow.com/questions/19682432/global-operator-overloading-in-f)と[FsControl - 標準アドホックのF#ベースライブラリ(https://github.com/gmpl/FsControl) –

答えて

39

F#でのファンクタの実装を停止する.NETの基本的な制限はありません。実際、.NETメタデータで直接表現することはできませんが、ユニオンタイプのような他のF#言語機能は使用できません。ファンクタを持つ言語のコンパイラ(標準ML、OCamlなど)には、defunctorizeと呼ばれるパスがあります。これは、C++テンプレートの展開と同様に機能し、ファンクタを通常のモジュールに特化して「平坦化」します。

F#コンパイラは同じことをすることができますが、次にこれを他の.NET言語にどのように公開するかを尋ねなければなりません。ファンクタはで直接にエンコードされていない可能性があるため、.NETの型システムではエンコードされています。その表現がC#またはVB.NETから使用するのが難しい/不可能な場合は、F#の関数を含めることは意味がありますか? F#の成功の重要な部分は、C#とVB.NETで(双方向で)簡単に相互作用する能力から来ています。

EDIT:私を間違えないでください - F#でファンクションを持っているのが大好きですが、現在は苦労しているか、またはそれを実装することが不可能ないくつかのケースを処理するのに本当に便利です。言語がまだFunctorを持っていない主な理由は、interopの問題が解決されていないということだけです。実際にメタデータエンコーディングの問題は簡単な部分です。

EDIT 2:コードMLtondefunctorize域用:defunctorize.fun

アップデート:私はファンクタは実際に .NET型システム内で表現することができる方法についての考えを持っていたので、私は一緒に入れ少しの実験。これはきれいではありませんが、機能しています。だから、F#がいつかファンクターをサポートすることは少なくとも可能であることは分かっています。実際には、私の実験コードで見られる複雑さはすべてコンパイラ/言語によって隠されています。あなたがチェックアウトしたい場合:experimental-functors

+1

+1 - あなたはおそらくinteropで頭の爪を打つでしょう。 SML.NETのファンクタが他の.NET言語にどのように登場したのか? – Daniel

+0

@Danielこれは役に立ちますか? [相互運用性の冒険:SML.NETエクスペリエンス](http://research.microsoft.com/pubs/67332/p53-benton.pdf) –

+0

@GuyCoder:ありがとうございます。しかし、私はファンクタの表現方法については何も見ていませんそこのCILにJackが言ったことに基づいて、あるファンクタがいくつかの標準モジュールに "デフュメンタル化"され、他の.NET言語にも使われていると仮定すべきでしょうか? – Daniel

関連する問題