関数型言語について、なんとなくは知っているけれども、 人に説明できないので、 調べてみた. いろんなサイトや書籍からの引用を含みます. 間違えてたら教えてください.
関数型プログラミングとは
関数型プログラミングとは、 複数の式を関数の適用によって組み合わせていくプログラミングスタイル. (from Wikipedia) https://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E
なぜ関数型プログラミングが重要か
- 分散処理や並行処理につよい. マルチコア、メニーコア、分散クラウド時代には、 それを容易にするパラダイムが必要です. 値を変更しない性質や、新しい平行モデルの導入によって、 CPUのコアを十二分に生かすことができるプログラミングができます.
- コード量が少なくなる. 関数が値として扱えることによって、より抽象化がすすみ、 結果コード量が少なくなります. Scalaは Javaの 1/2のコード量でかけるとか.
バグりにくい・バクらせにくい 高度な制約条件を"型"として表現し、その制約条件が守られているかを コンパイル時などに検査させることが可能です. このことによって、コンパイルするだけでバグが出にくくなります.
(https://gihyo.jp/book/2014/978-4-7741-6926-2 p4より)
どんな特徴があるか
以下のような特徴をもつプログラミングスタイルをもつ.
- immutable (いみゅーたぶる)
- 副作用がない
- 関数はファーストクラス(第一級)
(from https://qiita.com/f81@github/items/9f0b9cc5c0f28deb48e2)
immutable
immutableとは、不定状態. 状態を全く変更できないということ. 変数に値が一度束縛されると変更できない。C言語でいう const.
副作用がない
副作用とは、状態を参照したり、あるいは状態に変化を与えること. 代入は副作用.副作用がないとは、関数を何度実行しても、 結果が変わらないことをいう.
immutable性や副作用がないプログラミングパラダイムが平行処理に強くなる.
第一級関数・高階関数
第一級関数とは、関数を変数に格納できる性質のこと. 高階巻数とは、関数を引数にしたり、あるいは関数を戻り値とする性質のこと.
このような性質で、関数を自在に組み合わせて抽象化できることで、 コード量がずっと少なくなり、シンプルなコードがかけるようになる.
どんな関数型言語があるか
主要な関数型言語を列挙します.
- Scala: Javaを置き換える勢いがある、現在もっとも注目の言語. オブジェクト指向と関数型の両方の特徴をもつハイブリッド言語.
- Clojure: JVM上で動作するLisp言語. Scalaのライバル.
- Haskell: もっとも関数型言語の特徴をもつ言語. 難しい概念が乱立する言語.
- Elixir: 次に来る大物Web言語. 並行性と信頼性に特徴がある.
どうやって勉強するか
学びたい言語を決めて、その言語の本を読むのがよい勉強法だと思います. 以下、自分が勉強した経験をもとに、参考情報を載せます。
MOOCというオンラインでプログラミングを学べるWebサイトがあります.
Scala:
- {coursera}Scala作者直伝の講座!Functional Programming Principles in Scalaを受けた | Futur.
- https://www.coursera.org/course/progfun
Haskell:
- Haskell で 関数型言語入門! edX の Introduction to Functinal Programming を受けた. | Futurismo
- https://www.edx.org/course/introduction-functional-programming-delftx-fp101x-0
Clojure:
- https://mooc.fi/courses/2014/clojure/
- オンライン学習 Functional programming with Clojure をやってみた | Futurismo
書籍は以下が古典として有名です. 計算機プログラムの構造と解釈(通称SICP)
関数プログラミング実践入門. Haskell を題材に 関数型言語について解説してる本.