找不到参数 e 的隐式值
Posted
技术标签:
【中文标题】找不到参数 e 的隐式值【英文标题】:could not find implicit value for parameter e 【发布时间】:2016-03-31 16:35:40 【问题描述】:case class Cat(name: String)
object CuterImplicits
implicit class CatCuteChecker(c: Cat)
def isCute(c: Cat) = true
trait CuteChecker[A]
def isCute(a: A): Boolean
object CheckingForCuteness
def isItCute[A](a: A) = implicitly[CuteChecker[A]].isCute(a)
object Main extends App
CheckingForCuteness.isItCute[Cat](Cat("funny"))
如何解决:
错误:(17, 37) : CuteChecker[A] def isItCute[A](a: A) = 隐含[CuteChecker[A]].isCute(a) ^
【问题讨论】:
【参考方案1】:如果您使用implicitly
,则只会生成a value implicitly in scope "explicitly" available。所以你的isItCute
方法应该是以下两种变体之一:
def isItCute[A: CuteChecker](a: A) = implicitly[CuteChecker[A]].isCute(a)
def isItCute[A](a: A)(implicit cc: CuteChecker[A]) = cc.isCute(a)
接下来,您需要 Cat
的隐式实例。 implicit class
在这里对您没有帮助,因为它需要 Cat
类型的非隐式值。您可以看到这种方法是错误的,因为从未使用过构造函数参数。你可以使用implicit object
:
implicit object CatCuteChecker extends CuteChecker[Cat]
def isCute(c: Cat) = true
最后,您在对象CuterImplicits
中提供隐式。要让Main
看到它们,您需要import the contents:
object Main extends App
import CuterImplicits._
CheckingForCuteness.isItCute[Cat](Cat("funny"))
【讨论】:
问题请在isItCute
中主要我传递Cat
类型的对象。 def isItCute[A: CuteChecker](a: A)
的签名正在接收a
,它说它的类型是[A: CuteChecker]
,所以它看起来像是想要接收CuteChecker
,除非我不明白A: Cutechecker
的含义。我怎样才能收到来自Cat
的不同类型?我没有看到它们之间有任何转换,我所拥有的只是 Cat 的隐式 CuteChecker
def foo[A: Bar](x: A)
是def foo[A](x: A)(implicit bar: Bar[A])
的语法糖。如果您想要一个不同于Cat
的类型的CuteChecker
,您必须定义一个并将其带入范围,就像CatCuteChecker
一样。【参考方案2】:
您的情况存在多个问题。 implicitly
调用需要 CuteChecker
特征的实例,而 CatCuteChecker
既不是实例,也没有扩展此特征。此外,c
类参数是完全没有必要的。
您可以通过声明该子类型关系并提供implicit
值来解决您的问题:
object CuterImplicits
class CatCuteChecker with CuteChecker
def isCute(c: Cat) = true
implicit val catCuteChecker = new CatCuteChecker
【讨论】:
【参考方案3】:隐式必须在调用点可见不合格。 在这个答案中最好地描述了隐含可以变得可见的不同方式: https://***.com/a/5598107/843348.
您想要达到的目标也并不完全清楚 并且有许多可能的方法来实现类似示例。
一种可能性是猴子使用隐式类修补 Cat:
case class Cat(name: String)
object CuteImplicits
implicit class CuteCat(c: Cat)
def isCute = true
object Main extends App
import CuteImplicits._
Cat("funny").isCute
您将隐式放在关联类型的伴随对象中,它会自动可见。
case class Cat(name: String)
object Cat
implicit class CuteCat(c: Cat)
def isCute = true
object Main extends App
Cat("funny").isCute
在这样的最小示例中,不清楚为什么不将功能直接构建到 Cat
。
【讨论】:
以上是关于找不到参数 e 的隐式值的主要内容,如果未能解决你的问题,请参考以下文章
Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值