2016-05-20 11 views
2

をトリガしません。 。以下では正常に動作します:はなぜ暗黙のはのは、私が(ファンクタのような)いくつかのタイプのクラスを実装する必要がありトレイト、でいくつかのタイプを定義するとしましょう。このタイプの依存パスのシナリオで

trait LibraryUser { 

    val l: Library 
    import l._ 

    def use: T[Boolean] = { 
    val t: T[Int] = ??? 
    t.map(_ => true) 
    } 
} 

しかし、その代わりにパラメータでの方法でそれを使用した場合、暗黙的のインポートが機能していない(コメントアウト行はコンパイルされません)、あなたがのために暗黙的に記述する必要があります

object LibraryUser1 { 
    def use(l: Library): l.T[Boolean] = { 
    import l._ 

    val t: T[Int] = ??? 
    //t.map(_ => true) 
    toFunctorOps(t)(isFunctor).map(_ => true) 
    } 
} 

なぜこのようなケース/それに対して行うことができますか?

答えて

1

これは以前にバグとして提出されており、具体的にはSI-9625です。パス依存型で高級型を返すImplicits値は解決できません。ここでは、標準ライブラリを使用した簡単な例です:悲しいこと

trait TC[F[_]] 

trait Foo { 
    type T[A] 
    implicit val ta: TC[T] 
} 

object Bar { 
    def use(foo: Foo) = { 
     import foo._ 
     implicitly[TC[T]] // fails to resolve, but `implicitly[TC[T]](ta)` is fine 
    } 
} 

、暗黙的にも、最も明白な使用が失敗します。

object Bar { 
    def use(foo: Foo) = { 
     implicit val ta: TC[foo.T] = null 
     implicitly[TC[foo.T]] // nope! 
    } 
} 
関連する問題