解决"Show"类型类实例的隐式问题 [英] Resolving Implicit for `Show` Typeclass Instance

查看:78
本文介绍了解决"Show"类型类实例的隐式问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使Gender实现Show类型类.

I'm trying to make Gender implement the 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

接下来,我定义了一个函数,该函数在隐式Show[A]上调用show.

Next, I defined a function that calls show on an 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

最后,我为Show[Gender]创建了一个隐式类:

Finally, I created an implicit class for Show[Gender]:

scala> implicit class GenderShows(g: Gender) extends Show[Gender] {
     |    g match {
     |      case Male   => "Male"
     |      case Female => "Female"
     |    }
     | }
defined class GenderShows

我尝试了一下,但是找不到这样的隐式:

I tried it out, but it's not finding such an implicit:

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)
               ^

推荐答案

这不是类型类的工作原理.无需在类定义中扩展类型类,而是为类型单独提供一个实例作为隐式值:

This isn't really how type classes work. Instead of extending the type class in your class definition, you provide an instance for your type separately as an 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)

然后:

scala> val male: Gender = Male
male: Gender = Male

scala> f(male)
res0: String = Male

这是类型类优于子类型的一大优势-它们将数据类型的定义与您要在这些类型上支持的操作的定义脱钩(没人希望每次更改它们的继承层次结构时,例如,需要支持一个新的序列化库.

This is one of the big advantages of type classes over subtyping—they decouple the definition of your data types from the definition of the operations you want to support on those types (nobody wants to have to change their inheritance hierarchy every time they need to support a new serialization library, for example).

这篇关于解决"Show"类型类实例的隐式问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆