関数型プログラミングとはなんぞや? という勉強会で走り書きしたメモを起こしてみました。
正直、情報の精度としては怪しいの。
間違いがあったらご指摘ください。(他力本願)
関数型プログラミングとは
プログラミングパラダイムの1つ。
(パラダイム:考え方、捉え方)
パーツがコンパクトになり、再利用性が高い。
用語
副作用
関数呼び出し前後で「状態」を書き換えること。
同じ引数でも必ず同じ結果にならない。
純粋関数
副作用のない関数のこと。
同じ引数なら、いつでも同じ結果を返す。
特徴
関数プログラミングにはif文、for文などがなく、関数を定義する。
(if式あります。詳細はコメント参照)
一般的なfor文の例
total = 0;
for (i = 0; i <= 10; i++){
total = total + i;
}
sample.hs
total 0 = 0
total n = n + total (n - 1)
main = do
print $ total 10
基底部と再帰部を書いたらやってくれる。
関数はすべて部分適用が可能。詳しくは「カリー化」。
まとめ
関数をオブジェクトとして考える必要はなく、オブジェクト指向は他の言語でやればいい。
あくまでもパラダイムの一つとして付き合うと他の言語でも広がりを与えてくれる。
純粋のものと副作用のものは分けるべきで、副作用を触る場合はそれ専用のレイヤーを用意する。
設計するときは関数言語の本質はなんだっけと立ち直ってやっていくと良い。