2

假设我在一个特征中定义了一些类型,它应该实现一些类型类(比如仿函数):

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)
  }
}

为什么会这样/可以采取什么措施。

4

1 回答 1

1

这之前已作为错误提交,特别是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!
    }
}
于 2016-05-21T00:38:16.220 回答