2016-05-20 60 views
2

比方說,我定義的特質某種類型的,應該實施一些類型的類(如仿函數):爲什麼implicits未在這種類型的依賴路徑的場景觸發

import cats.Functor 
import cats.syntax.functor.toFunctorOps 

trait Library { 
    type T[+A] 
    implicit val isFunctor: Functor[T] 
} 

現在,我想使用這個庫。以下工作正常:

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

這是以前提交的一個bug,具體是SI-9625。蘊含與路徑有關的值並返回更高級的類型無法解析。下面是使用標準庫的一個簡單的例子:

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! 
    } 
} 
相關問題