证明一个类型类是Scala中另一个类型类的子集

时间:2014-11-25 14:09:25

标签: scala types functional-programming typeclass abstraction

假设我有以下两个类型类:

object Foo {
   sealed trait FooClass[A]
   implicit object FooString extends FooClass[String]
   implicit object FooInt extends FooClass[Int]       
}

object Bar {
  trait BarClass[A] //leave this one unsealed as we're attempting to prove that Foo is a subset of Bar, not the other way around.
  implicit object BarString extends BarClass[String]
  implicit object BarInt extends BarClass[Int]
  implicit object BarDouble extends BarClass[Double]
}

是否有可能向编译器提供一个提示,即Foo是Bar的一个子集,以便以下编译,而不更改任何一种方法的类型签名?

class Outer(callee : Inner) {
  import Foo._
  def call[A : FooClass](a) : Unit = callee.call(a);
}

class Inner
  import Bar._
  def call[B : BarClass](b) : Unit = ();
}

val test = new Outer(new Inner)
test.call(123)
test.call("Hello World")

我的主要目标是允许Outer类完全不知道BarClass类型类的存在 - 使用Inner类来完全抽象它。这可能吗?对于那些感兴趣的人,this git repository中有一些上下文 - 提交描述对我试图解决的问题有一些更详细的阐述。

0 个答案:

没有答案