【问题标题】:could not find implicit value for parameter e找不到参数 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) 找不到参数 e 的隐式值: CuteChecker[A] def isItCute[A](a: A) = 隐含[CuteChecker[A]].isCute(a) ^

【问题讨论】:

    标签: scala implicit


    【解决方案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://stackoverflow.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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-02
        • 2016-01-17
        • 2011-10-17
        • 2015-01-27
        • 1970-01-01
        • 2016-02-27
        • 2016-02-22
        • 2011-04-15
        相关资源
        最近更新 更多