モナド技術について

Kirpichovは、命令型言語の直感的な理解の過失について正しく記述しています: http ://antilamer.livejournal.com/300607.html



しかし、今では「モナド」という名前で隠れているものすべてが、教育学と伝道の面でかなり混乱していることを表明することが重要だと思われます。 SPJ /ワドラーの古典的なジョークは、「テアキャットで人々を怖がらせないために、この暖かいファジーなものと呼ぶべきだった」と聞こえます。 冗談は驚くほど近視眼的です。 問題は、「stuff」という単語を使用したタスクの名前付けと同じ面にあります(これは、アレンがGTDで苦労していることです)。

モナドは現在、歴史的に決定された原因、問題、解決策、技術的能力、理論的基礎(代数的および計算理論の側面の両方)の複雑なcomとしての世界です。

これらのすべてのレイヤーは、次のように最初の近似で分割できます(また、分割する必要があります)(順序はほぼランダムです)。



各段落にいくつかの段落を使います。

効果の説明。 Clean First(EMNIP)は、入出力をクリーンレイジー言語のエコシステムに投入することを扱ってきました。 I / Oは、この方法で処理された最初の効果にすぎません。 現在、清潔さと怠intoに収まらないすべてのものは、効果の形でフレーム化されています:トランザクション(および入出力との相互作用)、乱数ジェネレーター、並列計算の同期)。 外部の世界との接続に加えて、言語のネイティブなセマンティクスに適合しない計算もあります。たとえば、関数引数の厳密な計算(すべての命令型言語のように)です。

エフェクトを使用すると、問題の明確で限定的なサブセットのみを心配できます。これは、エフェクト以外のすべてが「単純」なものであり、「傷つける」ことはできないからです。デッドロックはなく、障壁や計算手順について考える必要はありません。 したがって、モンスターはケージに追い込まれます。

1. SPJ“ Beautiful concurrency” http://www.ece.iastate.edu/~pjscott/beautiful.pdfを参照してください 。2. Wadler“関数型プログラミングの本質” http://mynd.rinet.ru/~alexm/ monads / essence.pdf 3. SPJ「厄介な部隊に取り組む」 http://research.microsoft.com/en-us/um/people/simonpj/papers/marktoberdorf/ 4. Kiselev et al。 「純粋に機能的な遅延非決定性プログラミング」 http://www-ps.informatik.uni-kiel.de/~sebf/pub/icfp09.html

基本的なマイクロコンピューティング戦略。 Haskellの起源に立つ人々は、コンパイラ自体のプログラミングに主に興味を持っていたことを忘れないでください。 モナドを使用すると、計算中に発生するすべての基本的なプロセスを説明できます-引数の受け渡し、変数の字句的および動的な入れ子(Env)、例外処理、ステートマシンによる割り当ての表現(状態)、あいまいな計算(amb /リスト)失敗(多分/エラー)、継続(続き)、逆追跡を伴う計算。

モナドおよび関連するモナド変換器を介して実装されたモジュラーインタープリターも別の研究分野でした。 この設計により、インタープリターの個々のコンポーネントを単純に組み合わせて、目的の言語のインタープリター(算術+関数呼び出し+あいまいさなど)を構築することができました。 個々のコンポーネントは残りから分離されており、個別の開発が可能です。

このアプローチにより、対応するブロックを一度作成してチェックし、インタープリターまたはコンパイラーの作成を必要とするタスクに使用できることは明らかです。

1. Guy L. Steele Jr.を参照してください。 「モナドの構成によるインタープリターの 構築」、 http://mynd.rinet.ru/~alexm/monads/steele.pdf 2. S. Liang、P。Hudak「コンパイラー構築のためのモジュラー表示セマンティクス」 http://mynd.rinet .ru /〜alexm / monads / liang2.pdf 3. S. Liang、P。Hudak「モジュラーモナドセマンティクス」、1998 http://flint.cs.yale.edu/trifonov/cs629/modular-monadic-semantics.pdf

メタインターセプトコンピューティングのメカニズム。 Haskellの修道士は、JavaのインターフェースまたはC ++の概念のいずれかに似たタイプクラスを介して実装されます。 型クラスはモナドに完全に直交しています! タイプクラスを使用すると、計算を別のタイプの結果に「インターセプト」できます。

たとえば、Haskellで関数を記述して、2次方程式の根を計算できます。 3つの引数を渡すことで計算できます-その後、いくつかのルートを返します。 タイプクラスを使用すると、この関数を異なるコンテキストで「計算」できるため、計算の結果はJavaScriptコードになります。これは、二次方程式の根を計算するJavaScript関数です。

したがって、基本アルゴリズムの開発をその計算方法から分離することが可能です。

現在急速に発展している分野は、並列コンピューティング用のDSLの作成です。 Haskellでベクトル化されたアルゴリズムを記述し、それに対して一連のバックエンドを記述できます。SSEの場合、CUDAの場合、通常のCの場合、まだ登場していない他のベクトル化テクノロジーの場合です。 当然、このアルゴリズムは、基本的な正確さをデバッグするために、Haskellから直接計算することができます。

1. Lennar Augustssonのプレゼンテーション「Strongly Types DSEL」 http://www.infoq.com/presentations/Strongly-Typed-DSEL-Lennart-Augustssonを参照してください (最後に、Excelファイルを生成する言語についてのストーリーがあります)。 PDF

2.http//hackage.haskell.org/package/accelerate

3. http://cdsmith.wordpress.com/2009/09/20/side-computations-via-type-classes/ (モナドはまったくありません);

モナドの法則、理論的基礎、モナドの弟。 それらは、基盤が失敗しないことを少なくともある程度確信するために、いくつかの基本的なことを正式に証明する機会を提供します。 これは、最も基本的なライブラリの作成者だけでなく、自動セルフテストのあらゆる機会が熱意を持って歓迎されるような複雑さのタスクに到達した人にとっても興味深いものです。

厳密な型チェックと併せて、これにより、タスクが誤解されたり、矛盾が形成されたり、見かけ以上に複雑になったりする状況をキャッチできます。 また、プログラムを開発して、誤った変更の可能性を劇的に減らすこともできます。 そのため、プレゼンテーションのガロアは、特定のコード要件を型シグネチャの形式で常にエンコードしようとしていると述べています。

また、正式な構造( モノイドスタイルを含む)は、コンパイラレベル(プログラマがルールメカニズムを介して制御するものを含む)での最適化の幅広い範囲を開きます。 一部の厳密に構造化された関数は、ソースコードの抽象性を犠牲にすることなく、マシンコードにできるだけ近い形で最適化できます。

1. http://www.galois.com/blog/2009/04/27/engineering-large-projects-in-haskell-a-decade-of-fp-at-galoisをご覧ください /

2.http//comonad.com/reader/2009/iteratees-parsec-and-monoid/ (モノイダルスタイル)

3. http://www.cse.unsw.edu.au/~dons/papers/CLS07.html(dons et al。「ストリームフュージョン:リストからストリームへ、何もないところまで)



All Articles