这是我的第一个问题,所以我希望我能正确地做好一切。
我的情况是这样的:我想使用类型类来表示在某个函数下关闭某些类型。具体而言,类型类称为Substitutable
。目的是如果T
是Substitutable
的实例,那么您可以对其应用替换并获得T
作为回报。这是通过方法applySubstitution
实现的,Substitutable
的每个实例都必须实现。
集合继承了这个闭包属性;如果我将替换元素应用于T
的列表,其中T
是Substitutable
的实例,那么结果将再次是T
的列表,因此List[T]
本身就是Substitutable
的实例。
简而言之,如果List[T]
是一个实例,我想让Substitutable
成为T
的实例。我看不出如何表达这一点。我看待它的方式,我需要写一些类似
implicit objectSubstitutableList[T: Substitutable] extends Substitutable[List[T]],
但这是不可能的,因为我无法为隐式对象提供类型参数。
我该如何解决这个问题?
答案 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