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

値としての関数

第一級関数です。

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

関数は値である

Scalaでは、関数は第一級の値です。数値や文字列と同じように、変数に格納したり、引数として渡したり、他の関数から返したりできます。

object Main {
  def main(args: Array[String]): Unit = {
    val increment: Int => Int = x => x + 1
    println(increment(5))
  }
}

関数型の構文

Int => Stringという型は、Intを受け取りStringを返す関数を意味します。複数のパラメーターには括弧を使います:(Int, Int) => Int。

object Main {
  def main(args: Array[String]): Unit = {
    val add: (Int, Int) => Int = (a, b) => a + b
    val label: Int => String = n => s"value=$n"
    println(add(3, 4))
    println(label(7))
  }
}

ラムダ(無名関数)の構文

無名関数、つまりラムダは、(params) => bodyと書きます。名前を持たず、別の関数に直接渡すことがよくあります。

object Main {
  def main(args: Array[String]): Unit = {
    val square = (x: Int) => x * x
    println(square(6))
  }
}

高階関数

高階関数とは、関数をパラメーターとして受け取るか、関数を返す関数です。mapとfilterが代表的な例です。

object Main {
  def applyTwice(f: Int => Int, x: Int): Int = f(f(x))
  def main(args: Array[String]): Unit = {
    println(applyTwice(_ + 3, 10))
  }
}

関数をメソッドに渡す

コレクションのメソッドは関数を受け取ります。ラムダをインラインで渡すことも、名前付きの関数値を渡すこともできます。

object Main {
  def main(args: Array[String]): Unit = {
    val triple = (x: Int) => x * 3
    println(List(1, 2, 3).map(triple))
    println(List(1, 2, 3).map(x => x * 3))
  }
}

関数を返す

関数は別の関数を返すことができます。ここでは、multiplierが固定の係数で乗算する関数を返します。小さな関数ファクトリの例です。

object Main {
  def multiplier(factor: Int): Int => Int = x => x * factor
  def main(args: Array[String]): Unit = {
    val timesTen = multiplier(10)
    println(timesTen(5))
  }
}

メソッドと関数

defはメソッドを定義します。eta展開のアンダースコアであるmethodName _を使うか、関数が期待される場所でそのまま使用することで、メソッドを関数値に変換できます。

object Main {
  def doubleIt(x: Int): Int = x * 2
  def main(args: Array[String]): Unit = {
    val f: Int => Int = doubleIt
    println(f(8))
    println(List(1, 2, 3).map(doubleIt))
  }
}

パラメーターのない関数

関数は引数を取らないこともあります。その型は() => Tと書きます。計算を遅延させるのに便利です。

object Main {
  def main(args: Array[String]): Unit = {
    val greeting: () => String = () => "Hello!"
    println(greeting())
  }
}

コレクションに関数を格納する

関数は値なので、リストやマップに格納して動的に検索できます。これにより、小さなコマンドディスパッチャーを構築できます。

object Main {
  def main(args: Array[String]): Unit = {
    val ops: Map[String, (Int, Int) => Int] = Map(
      "add" -> (_ + _),
      "mul" -> (_ * _)
    )
    println(ops("add")(3, 4))
    println(ops("mul")(3, 4))
  }
}

設定としての関数

関数を渡すことで、呼び出し側が動作をカスタマイズできます。ここでは、汎用的なtransformAllがリスト全体に任意の関数を適用します。

object Main {
  def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
  def main(args: Array[String]): Unit = {
    println(transformAll(List(1, 2, 3), _ + 100))
    println(transformAll(List(1, 2, 3), _ * 10))
  }
}

よりすっきりしたカスタマイズ例

同じ考え方を、よりすっきりと記述した例です。呼び出し側が変換処理を指定するため、ヘルパーを汎用的かつ再利用可能に保てます。

object Main {
  def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
  def main(args: Array[String]): Unit = {
    println(transformAll(List(1, 2, 3), x => x + 100))
    println(transformAll(List(1, 2, 3), x => x * x))
  }
}

クイックチェック

高階関数とは何ですか。

まとめ

関数が第一級の値であることを学びました。

  • 関数をval、リスト、マップに格納できます
  • Int => Stringのような関数型があります
  • ラムダ:(x) => bodyと_による省略記法
  • 高階関数は関数を受け取るか、関数を返します
  • eta展開によって、メソッドを関数値にできます

よくある質問

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

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

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

第一級関数です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

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

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

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

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

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

  1. 値としての関数
  2. カリー化
  3. 合成
  4. クロージャ
← Scala for Backend Engineering & Functional Programmingに戻る