できるML functors完全にコードされます。NETとC#のサンプルソースコード/F#)?
質問
できるML functorsする実践的に表現します。純インターフェイスとジェネリック医薬品?はありま先端ML元の使用例識を覆すようなエンコーディング?
回答の概要:
一般の場合、答えはノーです。MLモジュールを特徴などの仕様の共有による署名[1])な地図です。当期純な概念です。
ただし、一部の使用例によって、熟語-慣用できます。これらのケースの基本 Set
元[2"が、ものfunctorialエンコードのmonads[3"が、より高度な利用のウなど、最後にtagless通訳[4, 5].
実践的なエンコーディングを必要と妥協などのセミ-安全downcasts.おのマイルは警戒.
ブログやコード:
解決
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でそれを表現する良い方法はないと確信しています。
詳細な説明 MLモジュール、署名、ファンクターを同等のC#エンコーディングに変換したもの。誰かがそれを役に立つと思うことを願っています。
ブライアンのコメントはスポットです。ファンクタを使用して、問題のモナドでパラメータ化されたHaskell sequence :: (Monad m) => [m a] -> m [a]
の(厳密な)実装を提供するOCamlコードを次に示します。
module type Monad =
sig
type 'a t (*'*)
val map : ('a -> 'b) -> ('a t -> 'b t)
val return : 'a -> 'a t
val bind : 'a t -> ('a -> 'b t) -> 'b t
end
module type MonadUtils =
sig
type 'a t (*'*)
val sequence : ('a t) list -> ('a list) t
end
module MakeMonad (M : Monad) : MonadUtils =
struct
type 'a t = 'a M.t
let rec sequence = function
| [] ->
M.return []
| x :: xs ->
let f x =
M.map (fun xs -> x :: xs) (sequence xs)
in
M.bind x f
end
.NETで表現するのは難しいようです。
更新:
naasking
による手法を使用して、F#で再利用可能なsequence
関数をほとんどタイプセーフな方法でエンコードできました(ダウンキャストを使用)。