解析“显示”类型类实例的隐式
Resolving Implicit for `Show` Typeclass Instance
我正在尝试让 Gender
实现 Show
类型 class。
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
接下来,我定义了一个在隐式 Show[A]
上调用 show
的函数。
scala> def f[A : Show](x: A): String = implicitly[Show[A]].shows(x)
f: [A](x: A)(implicit evidence: scalaz.Show[A])String
最后,我为 Show[Gender]
创建了一个隐式 class:
scala> implicit class GenderShows(g: Gender) extends Show[Gender] {
| g match {
| case Male => "Male"
| case Female => "Female"
| }
| }
defined class GenderShows
我试过了,但没有找到这样的隐式:
scala> val male: Gender = Male
male: Gender = Male
scala> f(male)
<console>:20: error: could not find implicit value for
evidence parameter of type scalaz.Show[Gender]
f(male)
^
这并不是类型 class 的工作方式。您不是在 class 定义中扩展类型 class,而是单独为您的类型提供一个实例作为隐式值:
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)
然后:
scala> val male: Gender = Male
male: Gender = Male
scala> f(male)
res0: String = Male
这是类型 classes 相对于子类型的一大优势——它们将数据类型的定义与您希望在这些类型上支持的操作的定义分离(没有人愿意必须例如,每当他们需要支持新的序列化库时,都会更改他们的继承层次结构。
我正在尝试让 Gender
实现 Show
类型 class。
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
接下来,我定义了一个在隐式 Show[A]
上调用 show
的函数。
scala> def f[A : Show](x: A): String = implicitly[Show[A]].shows(x)
f: [A](x: A)(implicit evidence: scalaz.Show[A])String
最后,我为 Show[Gender]
创建了一个隐式 class:
scala> implicit class GenderShows(g: Gender) extends Show[Gender] {
| g match {
| case Male => "Male"
| case Female => "Female"
| }
| }
defined class GenderShows
我试过了,但没有找到这样的隐式:
scala> val male: Gender = Male
male: Gender = Male
scala> f(male)
<console>:20: error: could not find implicit value for
evidence parameter of type scalaz.Show[Gender]
f(male)
^
这并不是类型 class 的工作方式。您不是在 class 定义中扩展类型 class,而是单独为您的类型提供一个实例作为隐式值:
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)
然后:
scala> val male: Gender = Male
male: Gender = Male
scala> f(male)
res0: String = Male
这是类型 classes 相对于子类型的一大优势——它们将数据类型的定义与您希望在这些类型上支持的操作的定义分离(没有人愿意必须例如,每当他们需要支持新的序列化库时,都会更改他们的继承层次结构。