定义`隐式def` w /隐式?

时间:2017-01-30 21:42:57

标签: scala implicit

假设:

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,以便上述编译?

1 个答案:

答案 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是常见的,我也建议小心不要“太长连锁”。