🕌

[関数型プログラミング]評価とファーストクラスとは?

2024/12/27に公開

評価とファーストクラスとは?

関数型プログラミングは、純粋関数、高階関数、不変性などを中心に構成されます。これらの特徴を学ぶ前に密接に関連している 評価ファーストクラスの概念を理解することが重要です。

なぜ評価とファーストクラスは関数型プログラミングで重要なのか?

関数型プログラミングを学ぶ前にこの概念を学ぶ理由は以下の通りです:

  1. コード実行の原理理解
    評価とファーストクラスは、コードの実行方法や記述方法を理解する上で重要な役割を果たします。コードがどのように実行され、結果が導かれるのかを理解すると、問題解決能力が向上します。
  2. 効率的で柔軟なコード作成
    評価プロセスを理解すれば、計算を最適化することができ、ファーストクラスの概念を活用することで、再利用性と可読性の高いコードを作成できます。
  3. 関数型プログラミングの基礎
    評価とファーストクラスの概念は、関数型プログラミングの重要な特徴と直接関連しています。これを理解すると、高階関数やコールバック関数などの高度な機能も簡単に扱えるようになります。
    • 遅延評価(Lazy Evaluation): 評価プロセスを理解すれば、不要な計算を遅延させたり、省略する最適化技術を利用できます。
    • 高階関数とカリー化(Currying): 関数がファーストクラスであることを活用すれば、関数を返したり引数として渡したりする方法で高階関数やカリー化のようなパターンを簡単に実装できます。

1. 評価 (Evaluation)

評価とは、コードが実行されて値を生成する過程を指します。
つまり、プログラミング言語において、式が実行されるとき、その結果として値が導き出されることを評価と呼びます。評価プロセスを理解すれば、コードがどの順番で実行されるのかを明確に知ることができます。

評価の特徴

  • 順序: 左から右、内側から外側へ評価が行われます。
  • 最終結果の反映: 各式が評価されると、その値が最終結果に反映されます。

評価の過程の例

例1: 数学的演算の評価

(1 + 2) + 4 
// ステップ 1: (1 + 2) が先に評価され、3になる。
// 3 + 4
// ステップ 2: 3 + 4 が評価される。
// 結果: 7

例2: 配列の要素の評価

[1, 2 + 3]
// ステップ 1: 2 + 3 が先に評価され、5になる。
// 結果: [1, 5]
// 最終評価結果は [1, 5] です。

例3: スプレッド演算子の評価

[1, 2, ...[3, 4]]
// ステップ 1: スプレッド演算子 ...[3, 4] が先に評価される。 
// スプレッド演算子は [3, 4] の要素を展開します。
// 結果: [1, 2, 3, 4]

ファーストクラス (First-Class)

プログラミングにおけるファーストクラス(First-Class)とは、 値として扱えるすべてのものを指します。
ファーストクラスとは、「扱える自由」 を意味します。JavaScriptでは、数値、文字列、配列だけでなく、関数もファーストクラスとして扱われており、これにより、より柔軟で強力なコードを書くことができます。

ファーストクラスの特徴

ある要素がファーストクラスとして扱われる場合、次のような操作が可能です:

  1. 値として扱える
    データを値のように扱うことができます。数値や文字列は一般的に使用されるデータ型であり、ファーストクラスの要素です。
const a = 10; // 数値10は値として使われます。
const b = "hello"; // 文字列も値として使われます。
  1. 変数に格納できる
    値を変数に保存することができます。
const a = 10; // 変数aに10を格納します。
  1. 関数の引数として使用できる
    他の関数に渡すことができます。
const add10 = a => a + 10;
console.log(add10(5)); // 15

add10(a)では, add10引数として aという変数が渡されます。

  1. 関数の結果として返すことができる
    関数の実行結果として返すことができます。
const add10 = a => a + 10;
console.log(add10(5)); // 15

const add10 = a => a + 10;では、a + 10;が評価され、add10(a)の関数のリターン値として使用されます。その結果、result変数に関数の実行結果である a + 10;の値を格納できます。

参考資料: JavaScript ES6+のための関数型プログラミングとJavaScript ES6+

Discussion