しかし、今では「モナド」という名前で隠れているものすべてが、教育学と伝道の面でかなり混乱していることを表明することが重要だと思われます。 SPJ /ワドラーの古典的なジョークは、「テアキャットで人々を怖がらせないために、この暖かいファジーなものと呼ぶべきだった」と聞こえます。 冗談は驚くほど近視眼的です。 問題は、「stuff」という単語を使用したタスクの名前付けと同じ面にあります(これは、アレンがGTDで苦労していることです)。
モナドは現在、歴史的に決定された原因、問題、解決策、技術的能力、理論的基礎(代数的および計算理論の側面の両方)の複雑なcomとしての世界です。
これらのすべてのレイヤーは、次のように最初の近似で分割できます(また、分割する必要があります)(順序はほぼランダムです)。
- 効果を説明したいという願望(計算における命令的なような瞬間の純粋な実装)(Wadlerの作品を参照); ここには、I / O、STM、並列計算などが含まれます)
- 基本的なマイクロ計算戦略を実現するための便利なメカニズム-関数の呼び出し(名前による呼び出し/値による呼び出し)、あいまいさ、状態の変更(割り当て!)、例外の処理、失敗時の停止、継続、バックトラッキング;
- 言語にモナドを導入するためのメカニズムとしての型クラス、およびその結果、 計算のメタインターセプトのための便利なメカニズム (ドメイン固有の埋め込み言語にとって非常に便利)。
- 型クラスの使用に起因する厳密な型チェック 。オブジェクトの正しい使用を機械的に検証できます。
- モナドが適合するモナドの法則の存在。これにより、抽象コンビネータを具体化できます。 これにより、異なるサブジェクト領域間で予期しない同型を見つけることができ、プログラムの最適化と検証にも役立ちます。
- モナドの基礎となる詳細な理論的基礎 (カテゴリ理論)。 これにより、ベースライブラリの作成者の生活が楽になります。ベースライブラリの作成者は、すべての実際のプログラミングの基礎になります。
- モナドは、興味深い代数的に決定されたクラスの長いチェーンのクラスの1つにすぎず、その一部はモナドよりも弱く、一部はより強力です:Functor、Applicative、Monoid、Traversable、Foldable、Monad with friends、Arrow with friends;
- 特定の種類の計算を代数構造に具体化したいという要望( モノイドの計算 )。 これにより、最適化、プログラムの検証、抽象コンビネータの作成、および無制限の再帰の排除の範囲が広がります。結果の力に関しては、I / OがかつてIO Monadで確実に分離された方法に似ています。
各段落にいくつかの段落を使います。
効果の説明。 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。「ストリームフュージョン:リストからストリームへ、何もないところまで)