できるML functors完全にコードされます。NETとC#のサンプルソースコード/F#)?

StackOverflow https://stackoverflow.com/questions/1426239

  •  07-07-2019
  •  | 
  •  

質問

できるML functorsする実践的に表現します。純インターフェイスとジェネリック医薬品?はありま先端ML元の使用例識を覆すようなエンコーディング?

回答の概要:

一般の場合、答えはノーです。MLモジュールを特徴などの仕様の共有による署名[1])な地図です。当期純な概念です。

ただし、一部の使用例によって、熟語-慣用できます。これらのケースの基本 Set 元[2"が、ものfunctorialエンコードのmonads[3"が、より高度な利用のウなど、最後にtagless通訳[4, 5].

実践的なエンコーディングを必要と妥協などのセミ-安全downcasts.おのマイルは警戒.

ブログやコード:

  1. blog.matthewdoig.com
  2. higherlogics.blogspot.com
  3. monad元F#
役に立ちましたか?

解決

MLモジュールの重要な機能の1つは、仕様の共有です。 .NETにはそれらをエミュレートできるメカニズムはありません。必要な機械があまりにも異なります。

共有タイプをパラメーターに変えることでそれを試みることはできますが、これは署名を定義する機能を忠実にエミュレートできず、後で複数の異なる方法で共有を適用できます。

私の意見では、.NETはこの種の機械を備えたものから恩恵を受けるだろう。そうすれば、現代言語の多様性を真にサポートすることに近づくだろう。 MixMLのようなモジュールシステムに最近の進歩が含まれることを願っています。これは私の意見ではモジュールシステムの未来です。        http://www.mpi-sws.org/~rossberg/mixml/

他のヒント

HigherLogicsは私のこのブログ、私は間に多くの時間を調べてみました。に制限は抽象タイプのコンストラクタは、通称"ジェネリック医薬品以上のジェネリック".そうで、ベストを試してみましょう。真似MLモジュールとfunctorsくつもの(準安心です)。

基本的に付を定義することで抽象タイプは、インターフェースに対応したモジュールを署名で動作するパターンを示すことが分かった。抽象タイプおよびインターフェースを共有型のパラメータBのか"というブランド";のブランドは一般的に、サブタイプを実装するモジュールのインタフェース。のブランドをタイプに渡されたが、適切なサブタイプによって予測されたモジュールです。

// signature
abstract class Exp<T, B> where B : ISymantics<B> { }
interface ISymantics<B> where B : ISymantics<B>
{
  Exp<int, B> Int(int i);
  Exp<int, B> Add(Exp<int, B> left, Exp<int, B> right);
}
// implementation
sealed class InterpreterExp<T> : Exp<T, Interpreter>
{
  internal T value;
}
sealed class Interpreter : ISymantics<Interpreter>
{
  Exp<int, Interpreter> Int(int i) { return new InterpreterExp<int> { value = i }; }
  Exp<int, Interpreter> Add(Exp<int, Interpreter> left, Exp<int, Interpreter> right)
  {
    var l = left as InterpreterExp<int>; //semi-safe cast
    var r = right as InterpreterExp<int>;//semi-safe cast
    return new InterpreterExp<int> { value = l.value + r.value; }; }
  }
}

ご覧のとおり、キャストは、安全てのシステムにより、ブランドの発現タイプの試合のブランドは通訳です。にねじことは、すでにクライアントを作成し自Expクラスを指定します通訳ブランドです。がより安全でエンコード回避することでこの問題も、そのあまりにも扱通常のプラグインです。

後か このエンコーディングと翻訳の事例 からOlegの論文MetaOCaml、C#とLinq.の通訳できる透過的に実行プログラムを書くこの組み込み言語サーバ側にASP.NET またはクライアント側です。

この抽象化以上の通訳者の特徴であるオレグ-最終taglessエンコーディングです。リンク自身の論文のです。

インタフェースは初級です。ネットを使用しておりますのでインターフェイスをエンコードモジュールの署名モジュールとモジュールの署名については、クラスにこのエンコーディングです。このように、functors単にインタフェースを使用し直接のモジュールの署名が打ち出されている。-うに受け入れのインスタンスISymantics<B> 処理を委譲呼いています。

あなたの質問に本当に答えるのに十分なMLファンクタを知りません。しかし、 monadic プログラミングで常に見られる.Netの制限要因の1つは、<!> quot; forall M. 何らかのタイプの意味で「M」を抽象化できないことです。式M <!> lt; T <!> gt; <!> quot; (例:Mは型コンストラクター(1つ以上の汎用引数を取る型)です)。それがファンクタで時々必要/使用するものである場合、.Netでそれを表現する良い方法はないと確信しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top