web-dev-qa-db-ja.com

パラメータ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"))
}

直し方:

エラー:(17、37)パラメータeの暗黙的な値が見つかりませんでした:CuteChecker [A] def isItCute [A](a:A)=暗黙的に[CuteChecker [A]]。isCute(a)^

7
Jas

implicitlyを使用すると、単純に スコープ内の値が「明示的に」使用可能になります になります。したがって、isItCuteメソッドは、次の2つのバリアントのいずれかである必要があります。

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に表示するには、 コンテンツをインポート :する必要があります。

object Main extends App {
  import CuterImplicits._
  CheckingForCuteness.isItCute[Cat](Cat("funny"))
}
8
0__

呼び出しの時点で、暗黙的nqualifiedである必要があります。暗黙的に見えるようになるさまざまな方法は、この回答で最もよく説明されています: https://stackoverflow.com/a/5598107/843348

また、何を達成しようとしているのかが完全には明確ではなく、何かを達成するためのいくつかの可能な方法がありますlike例。

1つの可能性は、暗黙のクラスを使用して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に組み込まない理由が明確ではありません。

0
Daniel Mahler

あなたの状況には複数の問題があります。 implicitly呼び出しはCuteCheckerトレイトのインスタンスを予期しますが、CatCuteCheckerはインスタンスではなく、このトレイトを拡張しません。さらに、cクラスパラメータは完全に不要です。

サブタイプの関係を宣言し、implicitvalue:を指定することで、問題を修正できます。

object CuterImplicits
{
    class CatCuteChecker with CuteChecker
    {
        def isCute(c: Cat) = true
    }

    implicit val catCuteChecker = new CatCuteChecker
}
0
Clashsoft