找不到参数 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 的隐式值

找不到参数的隐式值

找不到参数 flash 的隐式值

找不到参数 enc 的隐式值:CsvEncoder[Shape]

找不到参数映射器的隐式值

akka-http:找不到参数解组的隐式值