diff --git a/functional-programming-lean/src/monad-transformers.md b/functional-programming-lean/src/monad-transformers.md index aed8329b..028cb5bd 100644 --- a/functional-programming-lean/src/monad-transformers.md +++ b/functional-programming-lean/src/monad-transformers.md @@ -1,20 +1,43 @@ - + # モナド変換子 + +モナドは純粋言語においてなんらかの副作用を実装するための手段です。状態やエラー処理など、異なるモナドは異なる作用を提供します。非決定論的検索やリーダ、さらには継続など、ほとんどの言語では利用できない便利な作用を提供するモナドも多く存在します。 + + + +典型的なアプリケーションはモナドを使わないテストの容易な関数を中心とし、それをモナドで必要なアプリケーションロジックを実装したラッパーで覆うことで成り立っています。これらのモナドは良く知られたコンポーネントから構成されます。例えば: + + + * 可変状態はパラメータと戻り値の型が同じ関数としてエンコードされます + + * エラー処理は `Except` に似た成功と失敗から構成される型を戻り値に持つものとしてエンコードされます + + * ロギングは戻り値とログのペアとしてエンコードされます + +しかし、それぞれのモナドを手作業で書くのはさまざまな型クラスの定型的な定義が必要になるため面倒です。これらの各コンポーネントは、ほかのモナドを修正して追加作用を加える定義に抽出することもできます。このような定義は **モナド変換子** (monad transformer)と呼ばれます。具体的なモナドはモナド変換子を組み合わせることで構築することができ。コードの再利用がより可能になります。