関数型プログラミング
このページでは、言語横断的な関数型プログラミングの要素について書こうかと思う
関数
高階関数
- 「関数を引数に取る関数」あるいは「関数を返り値とする関数」。
- 高階関数のうち、リストに対して再帰的な処理の仕組みを提供するものを慣用的にreduceと呼ぶ
- 高階関数は何であるかを簡潔に説明する
- 高階関数の引数に渡すものは、定義済みの普通の関数やクロージャーやラムダ関数(無名関数)となる
クロージャ
- プログラムのスコープ内の環境や変数を含む関数
ラムダ式 or 無名関数 or 関数リテラル
- 名前付けされずに定義された関数
パターンマッチ
パターンマッチ
- ここなんかいい記事なし, Haskellのパターンマッチの例は以下に書いた
継続
- call/cc
- 簡約!? λカ娘(算) の「第4章 オール・アバウト・ケーゾク・イン・スキーム」が良かった
型クラス
- 異なる型に共通のインターフェイスを持たせて、統一的に扱えるようにするもの
- 関数型Scala に少し記事を書いた
- 実装的な話
- Javaでもinterfaceを使えば似たようなことはできるが、拡張に対して開いていない(OCPに則していない)
- Scalaではこれをtraitやimplicitを使って実装する(継承や委譲ではなくmixin)
- それにより、関数型的な機能を自分のプロジェクトに対して自由に適用できる
- 型クラスは以下の項目の基礎となる
Monad系
Functor(ファンクタ)
- 全体を写せる (map over) 型クラス
- fmap
Applicative(アプリカティブ)
- ApplicativeはFunctorでもある
- Functorの機能に加えて文脈(context)付きの関数で、文脈付きのデータを処理できる
Monad(モナド)
- Applicativeよりも制約が強く・データによって処理の分岐ができる
- MonadはApplicative でもある
Monadにしておけば、Applicativeでできることは全部できるので、あえてApplicativeにしておく必要もないのでしょう…
- 具体例
- 処理の関心ごととは別に、文脈(context)をもつデータ型
- ScalaのOptionやJavaのOptional、HaskellのMaybeみたいなやつ
Free Monad(フリーモナド)
- Functorと組み合わせて様々な挙動を実現できるモナド
Monoid系
Semigroup(セミグループ)
Monoid(モノイド)
Allow(射)
射とは、圏論の用語で関数っぽい振る舞いをするものの抽象概念
Function1
PartialFunction
Kleisli
CoKleisli
参考文献
- 高階関数と遅延評価について
- クロージャとラムダ式について
- 型クラスについて
- Functor,Applicativeについて
- Applicative,Monadについて
- FreeMonadについて