FreeStyleWiki

関数型プログラミング

このエントリーをはてなブックマークに追加

[関数型プログラミング]

関数型プログラミング

このページでは、言語横断的な関数型プログラミングの要素について書こうかと思う

関数

  高階関数

  • 「関数を引数に取る関数」あるいは「関数を返り値とする関数」。
    • 高階関数のうち、リストに対して再帰的な処理の仕組みを提供するものを慣用的にreduceと呼ぶ
    • 高階関数は何であるかを簡潔に説明する
    • 高階関数の引数に渡すものは、定義済みの普通の関数やクロージャーやラムダ関数(無名関数)となる

  クロージャ

  • プログラムのスコープ内の環境や変数を含む関数

  ラムダ式 or 無名関数 or 関数リテラル

  • 名前付けされずに定義された関数

パターンマッチ

  パターンマッチ

継続

  • call/cc
    • 簡約!? λカ娘(算) の「第4章 オール・アバウト・ケーゾク・イン・スキーム」が良かった

型クラス

  • 異なる型に共通のインターフェイスを持たせて、統一的に扱えるようにするもの
  • 実装的な話
    • 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

参考文献