Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scalaの型クラスを完全に理解する

75086cfa4a46d4aa47deb38b409bd9cd?s=47 Jun Tomioka
August 23, 2018

 Scalaの型クラスを完全に理解する

75086cfa4a46d4aa47deb38b409bd9cd?s=128

Jun Tomioka

August 23, 2018
Tweet

Transcript

  1. Scalaの型クラスを 完全に理解する @jooohn1234

  2. M3, Inc. @jooohn1234 じょんと呼んでください!

  3. 型クラス (Type Classes)

  4. 型クラス is

  5. 型のクラス

  6. 型クラス is 型のクラス

  7. うんうん、わかるわかる!

  8. None
  9. None
  10. 型クラスは 同様の型のひとまとまり

  11. 雰囲気 0, 100, -50 Int ??? データ 型 型クラス インスタンス

    インスタンス クラス クラス
  12. Wikipedia

  13. “a type class is a type system construct that supports

    ad hoc polymorphism. ”
  14. うんうん、わかるわかる!

  15. “... is also known as function overloading or operator overloading.

  16. 型クラスは 同様の型のまとまりで Function Overloadingを実現す る型システム上の機構

  17. JsonEncoder 型クラスのイメージ • def toJson(value: ???): Json • こんなことができそう ◦

    toJson(1) ◦ toJson(“hoge”) ◦ toJson(User(userId = 1, name = “jooohn”))
  18. Scalaでの型クラス

  19. 1. 型クラスとなるtraitを宣言

  20. 1. 型クラスとなるtraitを宣言 型パラメータで型クラスの インスタンスの型を受け取 るようにする

  21. 1. 型クラスとなるtraitを宣言 JsonEncoder[A]の値が 存在するとき AはJsonEncoder型クラ スのインスタンス

  22. 2. 型クラスのインスタンスを作成 (implicit)

  23. 2. 型クラスのインスタンスを作成 (implicit) StringはJsonEncode型 クラスのインスタンス

  24. 3. 型クラスをimplicitに利用するメソッドを定義

  25. 3. 型クラスをimplicitに利用するメソッドを定義 JsonEncode[A] 型の値を implicitスコープから参照

  26. 4. 値(の型)によっていい感じに処理をoverload

  27. わからないでもない!

  28. それで、subtypingと比べて なにがうれしいの?

  29. これでもいいような

  30. Scalaで型クラスを使うn個の理由 1. finalな型の拡張 2. 値に依存しない関数の定義 3. scopeのコントロール 4. インスタンスの導出 5.

    解決する課題の違い
  31. 1. finalな型の拡張

  32. 1. Final なクラスの拡張 • Scala標準ライブラリなどで定義されている クラスなんかも拡張できる

  33. 2. 値に依存しない関数の定義

  34. 2. 値に依存しない関数の定義 • JsonDecoderを普通のtraitの使い方では 作れない。(Json => A のシグネチャ)

  35. 2. 値に依存しない関数の定義

  36. 3. スコープのコントロール

  37. 3. scopeのコントロール

  38. 4. インスタンスの導出

  39. 4. インスタンスの導出 • implicit def を用いた動的なインスタンス生 成

  40. 4. インスタンスの導出 • implicit def を用いた動的なインスタンス生 成

  41. 4. インスタンスの導出 • (Advanced) shapelessを用いたcase classか らのインスタンス導出

  42. 4. インスタンスの導出 • (Advanced) shapelessを用いたcase classか らのインスタンス導出

  43. 5. 解決する課題の違い

  44. 5. 解決する課題の違い モチベーション 利用時の型 subtyping 複数の型のインスタン スを、抽象型として扱い たい。 abstract: val

    strategy: Strategy = SimpleStrategy type classes 任意の型に関して行う 共通処理を提供した い。 concrete: toJson(1: Long)
  45. 5. 解決する課題の違い 0, 100, -50 Int JsonEncoder データ 型 型クラス

    インスタンス インスタンス クラス クラス subtyping
  46. 完全に理解した!