この事実を発見するのに 1 時間ほど立ち往生しました。
class Foo {
trait TypeClass[X]
object TypeClass {
implicit val gimme = new TypeClass[Int]{}
}
def foo[X : TypeClass](p: X): Unit = println("yeah " + p)
}
// compiles
val foo = new Foo()
foo.foo(4)
//does not compile
new Foo().foo(4)
could not find implicit value for evidence parameter of type _1.TypeClass[Int]
[error] new Foo().foo(4)
[error]
その理由がわかりません。私が考えることができる唯一のことは、scalac は、どのプレフィックスでもアクセスできる値の型を持たない型内で暗黙を見つけられないということです。参照できません。Scalac は明らかにFoo.this.foo
それにアクセスして暗黙を解決する必要がありますが、この場合はできません。
型クラスとパス依存型を組み合わせると、実質的に運命づけられているように感じます。この種のものを扱うことになります。そうしないとscalacはAPIメソッドの型を推測できず、ユーザーはそれらを明示的に宣言する必要があるためです。そこで、この種の設計を選択して、型が構築されFoo[T]
、API メソッドが既存の型を使用するようにしましたが、いくつかの本当に醜い問題とこの種のバグに遭遇し、私のアプリは過度に設計されたがらくたのように見えました...