为什么在这种依赖于类型的路径场景中隐式不触发
why do implicits not trigger in this type dependent paths scenario
假设我在特征中定义了某种类型,它应该实现某种类型 class(如仿函数):
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)
}
}
为什么会这样/可以采取什么措施。
这之前已作为错误归档,特别是 SI-9625。路径相关的隐含值和 return 更高种类的类型无法解析。这是一个使用标准库的简化示例:
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!
}
}
假设我在特征中定义了某种类型,它应该实现某种类型 class(如仿函数):
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)
}
}
为什么会这样/可以采取什么措施。
这之前已作为错误归档,特别是 SI-9625。路径相关的隐含值和 return 更高种类的类型无法解析。这是一个使用标准库的简化示例:
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!
}
}