scala - Resolving Implicit for `Show` Typeclass Instance -
i'm trying make gender
implement show
typeclass.
scala> trait gender extends show[gender] defined trait gender scala> case object male extends gender defined object male scala> case object female extends gender defined object female
next, defined function calls show
on implicit show[a]
.
scala> def f[a : show](x: a): string = implicitly[show[a]].shows(x) f: [a](x: a)(implicit evidence$1: scalaz.show[a])string
finally, created implicit class show[gender]
:
scala> implicit class gendershows(g: gender) extends show[gender] { | g match { | case male => "male" | case female => "female" | } | } defined class gendershows
i tried out, it's not finding such implicit:
scala> val male: gender = male male: gender = male scala> f(male) <console>:20: error: not find implicit value evidence parameter of type scalaz.show[gender] f(male) ^
this isn't how type classes work. instead of extending type class in class definition, provide instance type separately implicit value:
import scalaz._, scalaz._ trait gender case object male extends gender case object female extends gender implicit val gendershows: show[gender] = show.shows { case male => "male" case female => "female" } def f[a: show](x: a): string = implicitly[show[a]].shows(x)
and then:
scala> val male: gender = male male: gender = male scala> f(male) res0: string = male
this 1 of big advantages of type classes on subtyping—they decouple definition of data types definition of operations want support on types (nobody wants have change inheritance hierarchy every time need support new serialization library, example).
Comments
Post a Comment