【发布时间】:2018-05-03 12:20:27
【问题描述】:
我正在尝试创建一个依赖于用户输入的类型类。假设我们有一些案例对象:
sealed trait H
case object Ha extends H
case object Hb extends H
和类型类:
trait Foo[A] {
def bar: String
}
object Foo {
def bar[A : Foo] = implicitly[Foo[A]].bar
implicit object FooA extends Foo[Ha.type] {
override def bar: String = "A"
}
implicit object FooB extends Foo[Hb.type] {
override def bar: String = "B"
}
}
虽然我使用匹配找到了可行的解决方案:
variableComingFromMainArgs match {
case "a" => Foo.bar[Ha.type] _
case "b" => Foo.bar[Hb.type] _
}
我记得我们在 Scala 中有抽象类型,所以我可以将我的案例类更改为:
sealed trait H {
type T <: H
}
case object Ha extends H {
type T = this.type
}
case object Hb extends H {
type T = this.type
}
现在,根据用户对程序的输入,我可以执行类似的操作 val 变量 = Ha println(Foo.bar[variable.T])
但是,由于某种原因,这不起作用,并且该错误对我来说不是很有用:
error: could not find implicit value for evidence parameter of type Foo[variable.T]
println(Foo.bar[variable.T])
任何想法如果可以克服,如果不能,为什么?
谢谢。
【问题讨论】:
标签: scala typeclass path-dependent-type abstract-type