【发布时间】:2011-12-14 20:21:10
【问题描述】:
假设我有一个类型类Graph[G,V],它声明G 类型的对象也是具有V 类型顶点的图。
现在我有一个隐式函数,可以让我将 A 类型的对集合视为具有 A 类型顶点的图(无法表示未连接的顶点...)。我可以通过导入以下对象的范围来使用隐式。
object TupleSetGraph{
implicit def ts2graph[A]: Graph[Set[(A,A)],A] = new Graph[Set[(A,A)],A] {
def nodes(g: Set[(A, A)]): Set[A] = g flatMap (t => Set(t._1,t._2))
def adjacent(g: Set[(A, A)], n1: A, n2: A): Boolean = g.contains((n1,n2)) || g.contains((n2,n1))
}
}
假设我还希望能够映射顶点的内容,从而能够执行以下操作:
(_: Set[(A,A)]).map((_: A => B)): Set[(B,B)]
但是Set 上已经定义了一个map。如何处理相同的数据结构可以以不同的方式被视为同一事物(具有map函数的事物)的问题?
【问题讨论】:
-
你是如何定义类型类的?据我了解,您需要为要制作成图形的每个类创建一个 Graph[G,V] 实例,如 SetIsGraphable extends Graphable[Set[(V,V)], V] .但是由于 Set 是参数化的,你肯定需要为每个 V 提供一个实例。
-
@Submonoid 这是正确的,我已经添加了隐含的澄清。
-
您是否考虑过拥有
Set然后在其上调用map并让它做一些不是Set的地图实现(或子类实现)可能是个坏主意?如果你想做一些不同的事情,你必须以某种方式告诉编译器你想要一些不同的东西;最简单的方法是明确使用Graph而不是Set。 -
@Ben 我知道这是个问题。我想知道一些处理这种困境的好方法。
标签: scala types functional-programming scalaz