繁体   English   中英

如何在Scala中定义类型类的实例,该实例可用于特定类型的所有子类?

[英]How can I define an instance of a typeclass in scala that can be used for all subclasses of a particular type?

我正在尝试定义一个Show (从cats 0.9起)的实例,该实例可用于ADT的所有成员,如下所示:

import $ivy.`org.typelevel::cats:0.9.0`, cats.Show

sealed abstract class Colour(val name: String)

implicit val ColourShow = new Show[Colour] {
  def show(c: Colour) = c.name
}

object Colour {
  object Red extends Colour("Red")
  object Blue extends Colour("Blue")
}

import Show._

println(Colour.Red.show)

找不到适用于Red的适用实例,但是:

Compiling /Users/Rich/Projects/worksheets/fp-patterns/Colours.sc
/Users/Rich/Projects/worksheets/fp-patterns/Colours.sc:16: value show is not a member of object ammonite.$file.Colours.Colour.Red
val res_5 = println(Colour.Red.show)
                               ^
Compilation Failed

是否可以通过这种方式使用类型类? 我试图避免必须为每个具体的Colour实例定义一个单独的实例。

我认为您误会了这里发生的事情。 您定义的隐式确实适用于实例。

例如。

ColourShow.show(Colour.Red)

如果要能够在没有任何参数的情况下在Colour实例上调用show(),则需要提供一个特征定义,该特征具有show方法,不带任何参数,以及Color的隐式转换达到这个特征。

除了人们指出的内容之外,您还需要导入import cats.implicits._

请参阅以下工作示例: https : //scastie.scala-lang.org/d1egoaz/LVaJEccDSeas9VmzHqf1ug/1

您也可以使用较短的版本为Colour创建Show实例:

implicit val colourShow: Show[Colour] = Show.show[Colour](_.name)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM