给出一个虚构的F
型类:使用'隐def`
scala> trait F[A] {}
defined trait F
和这个定义,它采用了context bound
到要求输入A
有F
一个类型的类实例:
scala> def f[A : F](x: A) = ???
f: [A](x: A)(implicit evidence$1: F[A])Nothing
我所限定的Person
和类型类实例:
scala> case class Person(name: String)
defined class Person
scala> implicit val person: F[Person] = new F[Person] {}
person: F[Person] = [email protected]
个
而下面的编译:
scala> f(Person("foo"))
scala.NotImplementedError: an implementation is missing
但是,没有String
实现,因此它失败。
scala> f("foobar")
<console>:17: error: could not find implicit value for evidence parameter of type F[String]
f("foobar")
^
我然后使用定义的F[String]
:
scala> implicit def fInstance(x: String) = new F[String] {}
fInstance: (x: String)F[String]
但是,我不能运行:
scala> f("foobar")
<console>:18: error: could not find implicit value for evidence parameter of type F[String]
f("foobar")
^
,因为我没有一个隐含的F[String]
,而是String => F[String]
。
什么是使用这样的implicit def
满足F[String]
约束的正确方法,即用型的String
成功地调用f
功能?
我得到它的工作通过:
scala> implicit val x: F[String] = implicitly[String => F[String]].apply("foobar")
x: F[String] = [email protected]
scala> f("foobar")
scala.NotImplementedError: an implementation is missing
at scala.Predef$.$qmark$qmark$qmark(Predef.scala:230)
at .f(<console>:12)
... 33 elided
但我不知道这是否是正确的/干净的方式来做到这一点。
如果不知道类型类型想要捕获什么样的信息和操作,这真的很难回答,但是给定这个特殊的'F',你可以用'Person'完全相同的方式定义一个'String'实例。实例。 –
对于这种情况,如果提供'String',我只能构造'F [String]',即'F [String]'实例依赖于'String'参数。 –
作为一项后续工作,在同伴类以外使用“隐式”,即孤立的'隐式'实例是否糟糕? –