解决“Show”类型类实例的隐式问题

2024-05-14

我正在努力使Gender实施Show类型类。

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在隐含的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]:

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

这实际上并不是类型类的工作方式。您无需在类定义中扩展类型类,而是单独为您的类型提供一个实例作为隐式值:

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

这是类型类相对于子类型的一大优势 - 它们将数据类型的定义与您想要支持这些类型的操作的定义分离(没有人希望每次需要支持时都必须更改其继承层次结构)例如,一个新的序列化库)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决“Show”类型类实例的隐式问题 的相关文章

随机推荐