假设:
trait Foo[A]
class B
然后是以下implicit def
:
implicit def f[A](b: B)(implicit ev: Foo[A]): String = "foo"
我试图隐式解决B => String
,但无法编译:
scala> implicitly[B => String]
<console>:15: error: No implicit view available from B => String.
implicitly[B => String]
^
我猜测implicit Foo[A]
在我隐含的B => String
解决方案中可能会发挥作用。
如何调整implicitly
的参数,即B => String
,以便上述编译?
答案 0 :(得分:1)
使用类型代码而不是隐式转换的类似代码:
trait MyFunT[A] extends (A => String)
object MyFunT {
/**Factory to easily define an instance from a fun */
def apply[A](f: A => String): MyFunT[A] = new MyFunT[A] {
def apply(a: A): String = f(a)
}
}
implicit def foo[A](implicit ev: Foo[A]) = MyFunT[A] { a: A => /* do something with `a` and `ev` */ "foo" }
即使
implicit
基于/要求其他implicit
是常见的,我也建议小心不要“太长连锁”。