根据其他值的类型声明类型

时间:2014-12-04 09:43:38

标签: scala types

目前,我使用Scala Graph库获得以下Scala代码:

val g = Graph.from(nodes, edges)
            // nodes: List[Table]; edges: List[LkUnDiEdge[Table,String]]
            // inferred - g: Graph[Table, LkUnDiEdge]

...

def nodeTransformer(innerNode: Graph[Table, LkUnDiEdge]#NodeT) = {
    val node = innerNode.value
    Some( root,
          DotNodeStmt(node.name, style(node)) )
}

您可能会注意到nodeTransformer的参数是g类型的内部类型。类似的代码在代码库中的其他位置重复具体的Graph类型或其某些类型参数。

类型推断在所有地方都不起作用,我想要一种表达这种类型依赖关系的方法,而不需要在整个代码中重复相同的显式类型。例如,C ++ typeof运算符允许我重写函数,如下所示:

def nodeTransformer(innerNode: typeof(g)#NodeT) = {
    ...
}

当类型推断失败时,在Scala中表达此类静态类型依赖项的理智方式是什么?

1 个答案:

答案 0 :(得分:0)

怎么样:

def nodeTransformer(innerNode: g.NodeT) = {
    ...
}

与C ++ typeof相比,您应该为g准确传递innerNode,而不是任何其他Graph实例(即使是相同类型):What is meant by Scala's path-dependent types?

P.S。从泛型中提取类型(内部没有类型成员) - How to capture T from TypeTag[T] or any other generic in scala?