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

Popular posts from this blog

powershell Start-Process exit code -1073741502 when used with Credential from a windows service environment -

twig - Using Twigbridge in a Laravel 5.1 Package -

c# - LINQ join Entities from HashSet's, Join vs Dictionary vs HashSet performance -