0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

第一級値としての関数

関数を定義して引数として渡す方法、他の関数から返す方法、変数に格納する方法を学びます。

「第一級値としての関数」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全3レッスンが含まれています。

第一級値としての関数

関数型プログラミングの基礎へようこそ。Scala では、関数は単なる命令ではなく、第一級値です。

これは、数値や文字列などの他のデータ型と同じように、関数を扱えるという意味です。関数型プログラミングの中心となる概念です。

関数の変数への代入

val に数値を代入できるように、関数を代入することもできます。ここでは、greet が関数を保持する変数になります。

このシンプルな例を実行してみてください。

object Main {
  def main(args: Array[String]): Unit = {
    val greet = (name: String) => s"Hello, $name!"
    println(greet("Alice"))
  }
}

匿名関数(ラムダ)

前のシーンにある (name: String) => s"Hello, $name!" の部分は、匿名関数(ラムダ式とも呼ばれます)です。

名前を持たない関数で、必要な場所にインラインで定義されることが多いものです。短く具体的な処理にとても便利です。

object Main {
  def main(args: Array[String]): Unit = {
    val add = (x: Int, y: Int) => x + y
    println(s"5 + 3 = ${add(5, 3)}")

    val subtract = (a: Int, b: Int) => a - b
    println(s"10 - 4 = ${subtract(10, 4)}")
  }
}

メソッド引数としての関数

特に強力なのは、関数を別の関数の引数として渡せることです。このような関数を高階関数と呼びます。

下の applyOperation 関数は、2 つの数値と別の関数 op を受け取ります。その後、op を使って数値を組み合わせます。

object Main {
  def applyOperation(x: Int, y: Int, op: (Int, Int) => Int): Int = {
    op(x, y)
  }

  def main(args: Array[String]): Unit = {
    val add = (a: Int, b: Int) => a + b
    val result = applyOperation(5, 3, add)
    println(s"Result of addition: $result")
  }
}

関数型の理解

前のシーンにある型シグネチャ op: (Int, Int) => Int に注目してください。

  • (Int, Int):関数が 2 つの Int 引数を受け取ることを表します。
  • => Int:関数が Int を返すことを表します。

すべての関数には、入力と出力を表す型があります。これにより、Scala は型安全性を確保できます。

簡潔な関数の受け渡し

最初に名前付き関数を定義する必要は必ずしもありません。関数の引数が必要な場所に、匿名関数を直接渡すことができます。

特に単純な処理では、コードをより短く読みやすくできます。

object Main {
  def applyOperation(x: Int, y: Int, op: (Int, Int) => Int): Int = {
    op(x, y)
  }

  def main(args: Array[String]): Unit = {
    val result1 = applyOperation(10, 2, (a: Int, b: Int) => a * b)
    println(s"Multiplication: $result1")

    // Scala can often infer types, making it even shorter!
    val result2 = applyOperation(20, 4, (a, b) => a / b)
    println(s"Division: $result2")
  }
}

戻り値としての関数

関数は別の関数を返すこともできます。少し不思議に聞こえるかもしれませんが、柔軟で設定可能なコードを作るうえで非常に役立ちます。

ここでは、makeMultiplier が、入力に特定の係数を掛ける新しい関数を返します。

object Main {
  def makeMultiplier(factor: Int): Int => Int = {
    (x: Int) => x * factor
  }

  def main(args: Array[String]): Unit = {
    val multiplyByTwo = makeMultiplier(2)
    val multiplyByFive = makeMultiplier(5)

    println(s"5 * 2 = ${multiplyByTwo(5)}")
    println(s"10 * 5 = ${multiplyByFive(10)}")
  }
}

クロージャの理解

makeMultiplier が関数を返すと、返された関数は作成時の factor の値を「覚えて」います。これをクロージャと呼びます。

makeMultiplier の実行が終了した後も、multiplyByTwo 関数は係数が 2 であることを「知って」います。

第一級関数の利点

関数を第一級値として扱うことが、なぜ重要なのでしょうか。

  • 柔軟性:異なる関数を渡すことで、振る舞いを簡単に入れ替えられます。
  • 再利用性:渡された任意の関数に対して動作する汎用的な関数を作成できます。
  • 簡潔さ:特に匿名関数を使うと、より短く表現力の高いコードを書けます。
  • 関数型スタイル:強力なパターンを可能にする、関数型プログラミングの基盤です。

理解度を確認する

関数を第一級値として扱うことについて、理解度を確認してみましょう。

object Main {
  def execute(x: Int, op: Int => Int): Int = op(x)

  def main(args: Array[String]): Unit = {
    val square = (n: Int) => n * n
    val result = execute(5, square)
    println(result)
  }
}

関数を値として扱う:まとめ

よくできました。Scala における第一級値としての関数という基本概念を学びました。

  • 関数は変数に代入できます。
  • 関数を他の関数の引数として渡せます。
  • 関数を他の関数の結果として返せます。
  • これにより、高階関数やクロージャといった強力なパターンを利用できます。

この機能は、柔軟で再利用しやすく、表現力豊かな関数型 Scala コードを書くための鍵となります。次は、より高度な高階関数とカリー化について学びます。

よくある質問

「第一級値としての関数」レッスンは無料ですか?

はい。「第一級値としての関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全3レッスンが含まれています。

「第一級値としての関数」で何を学びますか?

関数を定義して引数として渡す方法、他の関数から返す方法、変数に格納する方法を学びます。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「第一級値としての関数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 第一級値としての関数
  2. 高階関数とカリー化
  3. 不変性と副作用
← Scala for Backend Engineering & Functional Programmingに戻る