up::

主軸を関数に据え、入力データを関数で加工して返すだけの思想を持った言語。

思想をもうちょっと真面目に言うと

  • 冪等性
    • 入力が同じなら出力は常に同じ
  • 参照透明性
    • 元のデータは変更されず、新たなデータが生成される
  • 副作用無し
    • 入力データ以外の余計な場所を変更しない

らへんを持っている。これに加えて再帰とかいろいろあるらしい。

手続き型もしくは命令型と対。
フローチャートは書けない。そこにやり方があるだけ。
手順ではなく定義。
どうやるか(How)でなく何があるか(What)。

厳密に言うと、命令型と対なのは関数型を含むより大きな概念、宣言型のほう。でもここでは説明のために命令型と関数型を対比させる。

ちょっと横道だが宣言型にはロジックプログラミング(Prologなど)、データクエリプログラミング(SQLなど)も含む。

関数型プログラミングと宣言型プログラミングの違いは何ですか? - Quora
関数型言語とはなんですか?主にどのような環境で使われますか? - Quora

さらに横道だがデータを主軸にしたデータ指向プログラミングというのがある。これは人間というよりハードウェアに向いたやり方。データに関数を付与してハードウェアで読みやすくする。goやrustにはそのための機能がついてたり。
[オブジェクト指向型→関数型の次に普及しそうなプログラミングパラダイムは何ですか? - Quora](https://jp.quora.com/オブジェクト指向型-関数型の次に普及しそうなプロ)
[オブジェクト指向と関数型プログラミングのどちらを用いて問題を解決すればよいのか、判断の基準はありますか? - Quora](https://jp.quora.com/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A8%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89)

あとで切り出すがオブジェクト指向の継承は問題がある。最初に型(クラス)を決める関係上、意味が硬直してしまいドメイン駆動にクッソ向いてない。
[オブジェクト指向において「継承」が問題視されやすいのは何故ですか? - Quora](https://jp.quora.com/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6-%E7%B6%99%E6%89%BF-%E3%81%8C%E5%95%8F%E9%A1%8C%E8%A6%96%E3%81%95%E3%82%8C%E3%82%84%E3%81%99%E3%81%84)

オブジェクト指向と対にされることがあるが、特にそういう反対の要素は無い。(データを隠すという発想は関数型でも出る)

関数型言語Elmでオブジェクト指向する - ジンジャー研究室

関数型言語と関数型プログラミングは別。
あくまで関数型の思想で作ってある言語というだけで、命令型プログラミングをすることは可能。(実際IO周りで組み込まざるを得なくなりがち)
もちろんその逆もしかり。

メリット

  • いつ試しても同じ結果→状態が無い
    • テストがしやすい
    • 組合せしやすい
    • バグが起きにくい
      • 別のところの値が溜まっていって変化が……(副作用)みたいなことはない。

また、参照透明であるため型推論が簡単。
これはオマケだが。

デメリット

その他

  • 「処理をどのように切り分けるか」の説明は無い
    • オブジェクト指向はその辺の示唆も含んでるので、少しとっつきにくかったり
    • 分けるのに便利なモジュールみたいな機能は各関数型言語にあるので、自分で考えてもろて
    • 普通に凝集度で良くないか。タスクごとに必要なものを纏める。
    • 疎結合。メッセージ結合。
    • クラスや関数を設計する時に何を考えればいいのか 品質 - Qiita

関数型プログラミングとは結局何なのか | 黒曜の吹き溜まり


ちなみに、ゲーム業界はある程度バグったほうが面白いのでオブジェクト指向がいいというアクロバットな意見も。

Q「関数型言語でもヒット作のゲームソフトを開発できたという話を見かけます。結局オブジェクト指向は使いどころはあるのですか?」|投資用アカウント


関数型はデータ置く、関数置くというシンプルな考え。
データをまとめて扱いやすくするのに、Haskellでは型クラスという物がある。クラスと似てるが、データ型をまとめてそれに関数を実装するみたいなの。

インターフェースがクラスにメソッドの実装を強制するものなら、
型クラスはデータにメソッド(関数)を持たせる。
(これでも副作用による関数自身の状態とは別枠っていうのが多分大切?)

型クラスとは何か?使用場面3選(Haskell)

そういう橋渡しじゃなくデータ構造の使い回しをしたいならレコード型。
値に名前をつけてひとまとまりにできる。

関数を纏めるならモジュールで。