応用的な手法
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/01/06 04:20 UTC 版)
「関数型プログラミング」の記事における「応用的な手法」の解説
ポイントフリースタイル 最初に解の集合となる候補を生成し、それらの要素に対して1つ(もしくは複数)の解にたどり着くまで関数の適用とフィルタリングを繰り返す手法は、関数型プログラミングでよく用いられるパターンである。 Haskell では、関数合成の二項演算子を使ってポイントフリースタイルで関数を定義することができる。関数をポイントフリースタイルで定義すると、データより関数に目が行くようになり、どのようにデータが移り変わっていくかではなく、どんな関数を合成して何になっているかということへ意識が向くため、定義が読みやすく簡潔になることがある。関数が複雑になりすぎると、ポイントフリースタイルでは逆に可読性が悪くなることもある。 モナド 詳細は「モナド (プログラミング)」を参照 「モナドは値と計算を文脈で包むものだ」「モナドには三通りある―計算順序の制御、副作用の制御、コンテナとしてのそれ」「クライスリ圏はモナドへのもう一つの基本視点だ」「モナドは文脈の型である―文脈に値を注入し、文脈内で関数を適用する」「モナドは他の型を包むラッパー型である―内側の型を構造化し、内側の型の計算を合成する」 モナドは概ね、値を包んだコンテナの計算を合成する仕組みとイメージできる。コンテナはあくまで抽象的な概念であり、環境、状態、文脈とも解釈される。コンテナは副作用の記録媒体としても扱われて、その中で得られた値をラッピングし、それは取り出されて次の計算に使える。値のコンテナ収納をここではunitと呼ぶ。unit: a->maとなる。maは[a]と読み替えてもよい。コンテナは入れ子にできるのでmmaや[[a]]にもなる。mmaをmaに、[[a]]を[a]に整理することをここではjoinと呼ぶ。join: m(ma)->maのようになる。unitとjoinの組み合わせでa ma mmaなどを内部で揃えてmaにすることをここではflatmapと呼ぶ。 モナドの土台の一つはクライスリ圏であり、関数f': a->bとunitを融合したようなクライスリ射f: a->mbがあった。このa->mbをunit値maに適用できるようにしたflatmapがモナドの基本である。そこから値の構造化やその計算の合成といった様々な拡張性が生まれる。 それへの第1ステップは、クライスリ射の合成<=<: (b->mc)->(a->mb)->(a->mc)であり、これはjoin . unit (b->mc).(a->mb)とされる。第2ステップは、<=<の(a->mb)をunit値にした拡張演算子=<<: (b->mc)->mb->mcである。これは(join . unit b->mc) mbとされる。この=<<の逆さ引数版が、本命のモナドflatmap>>=: mb->(b->mc)->mcになる。モナドflatmapはb->mcをunit値mbに適用できて、その返り値を次のflatmapの引数にして連結できるようにもなった。unit値maやmbはモナド値と言われる。 モナド値の型は構造を持つ。上述のコンテナに入れるだけのシンプル構造のa->maは付加モナドと言われる。ListモナドやMaybeモナドがそれに当たる。コンテナを環境、状態、文脈といった抽象構造にしたものもある。例外モナドa->m(a+e)、Readerモナドa->(e->ma)、Writerモナドa->m(w×a)、状態モナドa->(s->m(a×s))、継続モナドa->((a->mr)->mr)などである。それらの抽象構造は副作用を封入し、また参照透過性を維持する働きがある。
※この「応用的な手法」の解説は、「関数型プログラミング」の解説の一部です。
「応用的な手法」を含む「関数型プログラミング」の記事については、「関数型プログラミング」の概要を参照ください。
- 応用的な手法のページへのリンク