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

よく使う型クラス

Show、Ordering、Numeric です。

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

標準の型クラス

Scalaの標準ライブラリには、気付かないうちに日常的に使っている型クラスがいくつか含まれています。

  • Ordering[A] — 値の比較方法。
  • Numeric[A] — 数値の算術演算。
  • Show形式の表示(カスタム実装、またはCatsのShow)。

Orderingがsortedを支える

List.sortedには暗黙のOrdering[A]が必要です。標準ライブラリは、数値や文字列などのインスタンスを提供しています。

@main def run(): Unit = {
  println(List(3, 1, 2).sorted)
  println(List("pear", "apple", "fig").sorted)
}

カスタムOrdering

異なる順序で並べ替えるには、明示的なOrderingを渡します。たとえば降順や、導出したキーによる並べ替えができます。

@main def run(): Unit = {
  val nums = List(3, 1, 2)
  println(nums.sorted(Ordering.Int.reverse))
  val words = List("bbb", "a", "cc")
  println(words.sortBy(_.length))
}

Case ClassのOrdering

独自の型にOrderingインスタンスを提供すると、その型のコレクションを並べ替えられます。Ordering.byを使うと、キーからインスタンスを導出できます。

case class Person(name: String, age: Int)

object Main {
  implicit val byAge: Ordering[Person] = Ordering.by(_.age)

  def main(args: Array[String]): Unit = {
    val people = List(Person("A", 30), Person("B", 20))
    println(people.sorted)
  }
}

Numericが算術演算を抽象化する

Numeric[A]を使うと、任意の数値型で動作する関数を記述できます。リストのsumはこれに依存しています。

@main def run(): Unit = {
  println(List(1, 2, 3).sum)
  println(List(1.5, 2.5).sum)
}

ジェネリックな数値コードを書く

context bound [A: Numeric]を使うと、任意の数値型に対して加算や乗算をジェネリックに実行できます。Numeric[A]のインスタンスが提供する演算を使用します。

object Main {
  def addAll[A: Numeric](xs: List[A]): A = {
    val num = implicitly[Numeric[A]]
    xs.foldLeft(num.zero)(num.plus)
  }

  def main(args: Array[String]): Unit = {
    println(addAll(List(1, 2, 3)))
    println(addAll(List(1.0, 2.0, 3.5)))
  }
}

Numeric演算子

インスタンスのImplicitsをimportすると、ジェネリックな数値型で通常の演算子(+、*)を使えるようになり、コードを自然に読めます。

object Main {
  def square[A](a: A)(implicit num: Numeric[A]): A = {
    import num._
    a * a
  }

  def main(args: Array[String]): Unit = {
    println(square(5))
    println(square(2.5))
  }
}

Show型クラス

Showは、toString(すべての型に存在します)とは異なり、型安全な方法で値をテキストとして表示します。Catsが提供していますが、ここでは最小限のバージョンを示します。

trait Show[A] { def show(a: A): String }

object Show {
  implicit val intShow: Show[Int] = n => s"Int($n)"
  def apply[A](implicit s: Show[A]): Show[A] = s
}

object Main {
  def main(args: Array[String]): Unit = {
    println(Show[Int].show(42))
  }
}

Orderingとmax/min

コレクションのmax、min、maxByなどのメソッドは、内部でOrderingを使用しています。

@main def run(): Unit = {
  val xs = List(4, 9, 1, 7)
  println(xs.max)
  println(xs.min)
  println(List("a", "abc", "ab").maxBy(_.length))
}

Orderingを組み合わせる

タプルに対してOrdering.byを使うと、複合的な順序付けを構築できます。あるフィールドで並べ替えた後、別のフィールドで並べ替えることもできます。

case class Rec(group: String, score: Int)

object Main {
  implicit val ord: Ordering[Rec] = Ordering.by(r => (r.group, -r.score))

  def main(args: Array[String]): Unit = {
    val data = List(Rec("b", 5), Rec("a", 1), Rec("a", 9))
    data.sorted.foreach(println)
  }
}

ここで型クラスを使う理由

比較と算術演算が型クラスだからこそ、インスタンスを提供するだけで、同じsortedやsumを組み込み型にも独自の型にも使用できます。これは、標準ライブラリがアドホック多相を利用している例です。

理解度チェック

標準の型クラスに関する知識を確認しましょう。

まとめ

一般的な標準の型クラスについて学びました。

  • Ordering[A]はsorted、max、minを支えます。Ordering.byで構築できます。
  • Numeric[A]はジェネリックな算術演算を可能にし、sumを支えます。
  • Show形式のクラスは、型安全に値を表示します。

よくある質問

「よく使う型クラス」レッスンは無料ですか?

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

「よく使う型クラス」で何を学びますか?

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

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

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