将类型类成员扩展到集合

时间:2015-11-03 16:57:46

标签: scala typeclass

这是我的第一个问题,所以我希望我能正确地做好一切。

我的情况是这样的:我想使用类型类来表示在某个函数下关闭某些类型。具体而言,类型类称为Substitutable。目的是如果TSubstitutable的实例,那么您可以对其应用替换并获得T作为回报。这是通过方法applySubstitution实现的,Substitutable的每个实例都必须实现。

集合继承了这个闭包属性;如果我将替换元素应用于T的列表,其中TSubstitutable的实例,那么结果将再次是T的列表,因此List[T]本身就是Substitutable的实例。

简而言之,如果List[T]是一个实例,我想让Substitutable成为T的实例。我看不出如何表达这一点。我看待它的方式,我需要写一些类似

的东西
implicit objectSubstitutableList[T: Substitutable] extends Substitutable[List[T]],

但这是不可能的,因为我无法为隐式对象提供类型参数。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你需要一个隐式def,因为List [T]的类型类需要一个隐式参数(T的类型类实例)。

where url = 'www.someaddress.com/**@?something**=sth' ESCAPE '@';

为String

定义类型类实例
trait Substitutable[T] {
  def applySubstitution(value: T, f: String => String): T 
}

object Substitutable {
  implicit def listIsSubstitutable[T: Substitutable]: Substitutable[List[T]] =
    new Substitutable[List[T]] {
      def applySubstitution(value: List[T], f: String => String): List[T] =
        value.map(x => implicitly[Substitutable[T]].applySubstitution(x, f))
    }
}

自动生成List [String]的Typeclass实例

implicit val stringIsSubstitutable: Substitutable[String] =
  new Substitutable[String] {
    def applySubstitution(value: String, f: String => String) = f(value)
  }

这不起作用,因为隐式范围中没有Substitutable [Int]。

scala> implicitly[Substitutable[List[String]]]
res3: Substitutable[List[String]] = Substitutable$$anon$2@30376991