【開発技術】バグを減らす設計思想!「関数型プログラミング」|情報処理問題1000本ノック
命令を順番に実行する「手続き型」とは異なり、計算を「関数の組み合わせ」として捉える。モダンな開発で必須知識となった関数型プログラミングの核心を攻略しましょう。
1. 【 問題 】:プログラミングパラダイムの特性
【 問題 】 関数型プログラミングの特徴に関する記述のうち、最も適切なものはどれでしょうか?
① 変数の値を頻繁に書き換えることで、処理の効率を高めメモリの使用量を抑える。
② 同じ引数を与えても、実行するタイミングやシステムの内部状態によって異なる結果を返す。
③ 関数を「第一級オブジェクト」として扱い、他の関数に引数として渡したり、戻り値として受け取ったりできる。
④ グローバル変数を多用し、どこからでも自由にデータを変更できるようにしてプログラムの柔軟性を担保する。
2. 正解:
正解: ③ 関数を「第一級オブジェクト」として扱い、他の関数に引数として渡したり、戻り値として受け取ったりできる。
3. 解説:状態を変えない「安全」な計算
関数型プログラミングは、「状態の変化」をできるだけ排除し、数学的な関数(入力に対して常に出力が一意に決まるもの)を組み合わせてプログラムを構築する手法です。
■ 純粋関数(Pure Function)
・同じ引数(入力)を渡せば、「いつでも必ず同じ結果(出力)」が返ってくる関数。外部の変数を勝手に書き換えたりしないため、予測しやすくテストが超簡単になります。
■ 不変性(Immutability)
・一度作ったデータは「後から書き換えない」というルール。値を変更したいときは、元のデータを変えるのではなく、新しいデータを作り直します。
■ 第一級オブジェクト(First-Class Object)としての関数
・関数を「数値」や「文字列」と全く同じように扱えます。つまり、関数の中に別の関数を引数として放り込んだり(高階関数)、関数を戻り値として出力したりできます。
★ ①・④:値をどんどん書き換えるのは手続き型やオブジェクト指向の特徴であり、関数型では嫌われます(バグの原因になるため)。
★ ②:タイミングで結果が変わるものは「純粋関数」ではないため、関数型の特徴に反します。
1. 理解のコツ: 数学の $f(x) = x + 2$ を思い出してください。 $x$ に $3$ を入れたら、昨日計算しても、10年後に計算しても、絶対に答えは $5$ ですよね。途中で勝手に数式が書き換わることもありません。この「いつでも、どこで実行しても、絶対に計算結果がブレない安心感」を目指すのが関数型プログラミングです。
2. 試験対策の視点: 「純粋関数」「副作用がない(外部に影響を与えない)」「不変性(イミュータビリティ)」「第一級オブジェクト(ファーストクラス)」という言葉が出たら関数型プログラミングが正解です。近年は、JavaやJavaScript、Pythonなど、あらゆる主要言語に関数型の機能(ラムダ式など)が取り入れられているため、開発技術分野のトレンド問題として頻出です。
4. まとめ
「関数をデータと同じように扱い、状態変化(副作用)のないコードを目指す思想」。これが関数型プログラミングです。マルチコアCPUによる並行・並列処理(マルチスレッド)を行う際にも、データが勝手に書き換わらない関数型の特性は圧倒的な強みを発揮します。