gpt4 book ai didi

scala - 解析 `Show` 类型类实例的隐式

转载 作者:行者123 更新时间:2023-12-01 12:34:30 25 4
gpt4 key购买 nike

我正在尝试让 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[A] 上调用 show 的函数。

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

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

关于scala - 解析 `Show` 类型类实例的隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com