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

カリー化

部分適用です。

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

カリー化とは

カリー化とは、複数の引数を取る関数を、それぞれが1つの引数を取る関数の連鎖に変換することです。Scalaでは、複数のパラメーターリストを使って記述します。

object Main {
  def add(a: Int)(b: Int): Int = a + b
  def main(args: Array[String]): Unit = {
    println(add(3)(4))
  }
}

複数のパラメーターリスト

カリー化されたメソッドには、複数のパラメーターリストがあります:def f(a: Int)(b: Int)。各リストを順番に指定して呼び出します:f(1)(2)。

object Main {
  def combine(prefix: String)(value: Int): String = s"$prefix$value"
  def main(args: Array[String]): Unit = {
    println(combine("id-")(42))
  }
}

部分適用

引数リストの一部だけを適用し、残りを待機する関数を取得できます。これを部分適用と呼びます。

object Main {
  def add(a: Int)(b: Int): Int = a + b
  def main(args: Array[String]): Unit = {
    val addFive = add(5) _
    println(addFive(10))
    println(addFive(20))
  }
}

汎用関数を特化する

部分適用を使うと、汎用的な関数から特化した関数を構築でき、重複を減らせます。

object Main {
  def power(exp: Int)(base: Int): Int = math.pow(base, exp).toInt
  def main(args: Array[String]): Unit = {
    val square = power(2) _
    val cube = power(3) _
    println(square(5))
    println(cube(2))
  }
}

通常の関数をカリー化する

通常の関数値には、カリー化された形式に変換する.curriedメソッドがあります。

object Main {
  def main(args: Array[String]): Unit = {
    val add = (a: Int, b: Int) => a + b
    val curriedAdd = add.curried
    println(curriedAdd(3)(4))
  }
}

カリー化を元に戻す

Function.uncurriedヘルパーは、カリー化された関数を1つのパラメーターリストを持つ関数に戻します。

object Main {
  def main(args: Array[String]): Unit = {
    val curried: Int => Int => Int = a => b => a + b
    val normal = Function.uncurried(curried)
    println(normal(3, 4))
  }
}

カリー化が便利な理由

カリー化によって再利用性が高まります。最初の引数を一度固定し、残りの引数を変えながら結果を何度も呼び出せます。また、後続のリストでコンパイラーが型を推論しやすくなります。

object Main {
  def discount(rate: Double)(price: Double): Double = price * (1 - rate)
  def main(args: Array[String]): Unit = {
    val blackFriday = discount(0.3) _
    println(blackFriday(100))
    println(blackFriday(250))
  }
}

最後のリストでの型推論

複数のパラメーターリストを使う実用的な理由の1つは、コンパイラーが前のリストからラムダのパラメーター型を推論できることです。そのため、型を省略できます。

object Main {
  def fold[A](xs: List[A])(init: A)(op: (A, A) => A): A =
    xs.foldLeft(init)(op)
  def main(args: Array[String]): Unit = {
    val total = fold(List(1, 2, 3))(0)((a, b) => a + b)
    println(total)
  }
}

3つのリストでカリー化する

パラメーターリストはいくつでも指定できます。各呼び出しで1つのリストを渡すと、次のリスト用の関数が返されます。

object Main {
  def make(a: Int)(b: Int)(c: Int): Int = a + b + c
  def main(args: Array[String]): Unit = {
    println(make(1)(2)(3))
    val step = make(10) _
    println(step(20)(30))
  }
}

設定可能なバリデーターを構築する

よくある実用例は、検証ルールをカリー化してしきい値を固定し、結果として得られる述語をデータセット全体で再利用することです。

object Main {
  def atLeast(min: Int)(value: Int): Boolean = value >= min
  def main(args: Array[String]): Unit = {
    val adult = atLeast(18) _
    println(List(15, 21, 18, 12).map(adult))
  }
}

カリー化と部分適用

カリー化は、1引数関数への構造的な変換です。部分適用は、いくつかの引数を今渡し、残りを後で渡す操作です。カリー化された関数を使うと、部分適用を自然に行えます。

object Main {
  def greet(greeting: String)(name: String): String = s"$greeting, $name!"
  def main(args: Array[String]): Unit = {
    val sayHi = greet("Hi") _
    println(sayHi("Ann"))
    println(sayHi("Bob"))
  }
}

クイックチェック

Scalaでカリー化されたメソッドを定義するには、どうすればよいですか。

まとめ

カリー化と部分適用について学びました。

  • カリー化されたメソッドは複数のパラメーターリストを使います:f(a)(b)
  • f(x) _で部分適用すると、新しい関数を取得できます
  • .curriedとFunction.uncurriedで形式を変換できます
  • 再利用、特化、型推論に役立ちます

よくある質問

「カリー化」レッスンは無料ですか?

はい。「カリー化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/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に戻る