カリー化
部分適用です。
「カリー化」は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フィードバックを取得できます。ローカル設定は不要です。