找不到参数 e 的隐式值
could not find implicit value for parameter e
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"))
}
如何修复:
Error:(17, 37) could not find implicit value for parameter e:
CuteChecker[A] def isItCute[A](a: A) =
implicitly[CuteChecker[A]].isCute(a)
^
您的情况存在多个问题。 implicitly
调用需要一个 CuteChecker
特征的实例,而 CatCuteChecker
既不是实例也不扩展这个特征。此外, c
class 参数是完全没有必要的。
您可以通过声明子类型关系并提供 implicit
value:
来解决您的问题
object CuterImplicits
{
class CatCuteChecker with CuteChecker
{
def isCute(c: Cat) = true
}
implicit val catCuteChecker = new CatCuteChecker
}
如果您使用 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"))
}
隐式必须在调用时可见不合格。
隐式变得可见的不同方式在这个答案中得到了最好的描述:
.
你想要实现的目标也不完全清楚
并且有许多可能的方法来实现某些东西就像这个例子。
一种可能性是猴子使用隐式 class:
修补 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
。
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"))
}
如何修复:
Error:(17, 37) could not find implicit value for parameter e: CuteChecker[A] def isItCute[A](a: A) = implicitly[CuteChecker[A]].isCute(a) ^
您的情况存在多个问题。 implicitly
调用需要一个 CuteChecker
特征的实例,而 CatCuteChecker
既不是实例也不扩展这个特征。此外, c
class 参数是完全没有必要的。
您可以通过声明子类型关系并提供 implicit
value:
object CuterImplicits
{
class CatCuteChecker with CuteChecker
{
def isCute(c: Cat) = true
}
implicit val catCuteChecker = new CatCuteChecker
}
如果您使用 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"))
}
隐式必须在调用时可见不合格。 隐式变得可见的不同方式在这个答案中得到了最好的描述: .
你想要实现的目标也不完全清楚 并且有许多可能的方法来实现某些东西就像这个例子。
一种可能性是猴子使用隐式 class:
修补 Catcase 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
。