Software Design 202507
つまみぐい関数型プログラミング
関数型プログラミングでは式が重要。
- 式 / Expression: 値を返すもの
- 文 / Statement: 値を返さないもの
文は副作用を起こすことを前提とした仕組みであると言える。 関数型プログラミングでは純粋であること(副作用がないこと&参照透過であること)が重要であるため、文は相性が悪い。 式を使った構文の具体例には以下のようなものがある。
- if 式 (e.g. 三項演算子など)
- パターンマッチング (e.g. switch/match/case)
- 再帰関数や for 式 (e.g. Python のリスト内包表記など)
文を使用しないことは大事。特に再代入文は immutability を壊すので強く禁忌される。 immutability が壊れると、副作用による変化を考慮しなければならなくなり、 最終的に組み合わせ爆発によって死ぬ。
でも世の中のデータはほとんどが可変である。ではどうするかというと、 データを関数によって次々と変換していくことで変化を表現する。 データに何らかの作用が発生するたびに、スナップショットを取るようなイメージである。 以前のデータは変更されず、保持され、必要ならばいつでもアクセスできる。
毎回変数に新しい名前をつけるなんで非効率すぎないか?という意見もある。 これを回避する方法として Shadowing(シャドウイング)がある。 この使用は議論が分かれるところで、たとえば Rust では許容されているが、Huskell では警告の対象となる。
また、毎回データを生成するなんて非効率すぎないか?という意見もある。 だが実際には、データの生成は変更部分だけを差し替えるような効率的な形で行われるので、あまり問題とはならない。
SQL アンチパターン / ライフサイクルの違うデータを同じテーブルに入れる
ライフサイクルが違うならテーブルを分けろ。