私は日付 (20120522) の scala 2.10.0-snapshot を使用しており、次の Scala ファイルがあります。
これは型クラスと基本的な型クラスのインスタンスを定義します:
package com.netgents.typeclass.hole
case class Rabbit
trait Hole[A] {
def findHole(x: A): String
}
object Hole {
def apply[A: Hole] = implicitly[Hole[A]]
implicit val rabbitHoleInHole = new Hole[Rabbit] {
def findHole(x: Rabbit) = "Rabbit found the hole in Hole companion object"
}
}
これはパッケージ オブジェクトです。
package com.netgents.typeclass
package object hole {
def findHole[A: Hole](x: A) = Hole[A].findHole(x)
implicit val rabbitHoleInHolePackage = new Hole[Rabbit] {
def findHole(x: Rabbit) = "Rabbit found the hole in Hole package object"
}
}
そしてここにテストがあります:
package com.netgents.typeclass.hole
object Test extends App {
implicit val rabbitHoleInOuterTest = new Hole[Rabbit] {
def findHole(x: Rabbit) = "Rabbit found the hole in outer Test object"
}
{
implicit val rabbitHoleInInnerTest = new Hole[Rabbit] {
def findHole(x: Rabbit) = "Rabbit found the hole in inner Test object"
}
println(findHole(Rabbit()))
}
}
ご覧のとおり、は検索しようとしてHole
いるメソッドを定義する単純な型クラスです。Rabbit
私はそれに関する暗黙の解決規則を理解しようとしています。
4 つの型クラス インスタンスすべてのコメントを外すと、scalac は
rabbitHoleInHolePackage
とのあいまいさについて文句を言いますrabbitHoleInHole
。(どうして?)をコメントアウトする
rabbitHoleInHole
と、scalac がコンパイルされ、"Rabbit が Hole パッケージ オブジェクトに穴を見つけました" というメッセージが返されます。(ローカルスコープの暗黙を優先すべきではありませんか?)次にコメントアウトする
rabbitHoleInHolePackage
と、scalac はrabbitHoleInOuterTest
とのあいまいさについて文句を言いrabbitHoleInInnerTest
ます。(なぜですか? eed3si9n の記事で、以下にリストされている URL で、彼は暗黙のうちに内側と外側のスコープが異なる優先順位を取ることができることを発見しました。)次に をコメントアウトする
rabbitHoleInInnerTest
と、scalac がコンパイルされ、「Rabbit が外側の Test オブジェクトに穴を見つけました」というメッセージが返されます。
ご覧のとおり、上記の動作は、暗黙の解決について読んだルールにはまったく従っていません。インスタンスのコメント化/コメント化解除で実行できる組み合わせの一部のみを説明しましたが、それらのほとんどは実際には非常に奇妙です-インポートとサブクラスにはまだ触れていません.
suereth によるプレゼンテーション、sobralによる stackoverflow の回答、およびeed3si9nによる非常に精巧な再訪を読んで見ましたが、まだ完全に困惑しています。