Haskellの型クラス機能はScalaではimplicitという機能で実装できます。
具体的には以下のようになります。
scala
1// Show型クラス
2trait Show[T] {
3 def show(value: T): String
4}
5
6case class Pair[A](_1: A, _2: A)
7
8// 型クラスのPair型インスタンス
9// implicitでTのShowインスタンスが存在するときのみPairもShowであることが保証される
10implicit def pairShowable[T](implicit showT: Show[T]) = new Show[Pair[T]] {
11 override def show(value: Pair[T]): String = s"_1: ${showT.show(value._1)}, _2: ${showT.show(value._2)}"
12}
13
14case class CanShow(value: String)
15
16// 型クラスをCanShow型にインスタンス化
17implicit def canShowAble = new Show[CanShow] {
18 override def show(value: CanShow): String = value.value
19}
20
21case class CantShow(value: String)
22
23// Show型クラスのインスタンスのみを扱える関数
24def show[T](value: T)(implicit showable: Show[T]) = println(showable.show(value))
25
26// Showインスタンスが存在してもしなくてもPairは定義できる
27val showPair = Pair(CanShow("a"), CanShow("b"))
28val ordinalPair = Pair(CantShow("a"), CantShow("b"))
29
30show(showPair) // => _1: a, _2: b
31show(ordinalPair) // CantShowのShowインスタンスが見つからないためコンパイルエラー
32
またこの話題についてはScalaの関数型ライブラリであるCatsの記事が詳しいです。
https://typelevel.org/cats/typeclasses.html
上の記事の日本語訳です
https://qiita.com/KtheS/items/ccd769de7977a61fd1a4
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。