値としての関数
第一級関数です。
「値としての関数」は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フィードバックを取得できます。ローカル設定は不要です。