gpt4 book ai didi

scala - Scala 中带有列表的递归类型

转载 作者:行者123 更新时间:2023-12-03 21:28:16 24 4
gpt4 key购买 nike

类似于mutually recursive types in scala我正在尝试在 Scala 中创建一个相互递归的类型。

我正在尝试制作一个用这种类型定义的图(编译):

 case class Node(val id : Int, val edges : Set[Node])

但我不明白我如何实际创建这种类型的东西,因为为了用边 B 和 C 初始化节点 A,我至少需要有一个对 B 和 C 的惰性引用,但我不能' t 同时创建它们的边集。

是否可以实现这种递归类型?

编辑:

这是我目前用于将显式邻接列表转换为自引用邻接列表的解决方案。

def mapToGraph(edgeMap : Map[Int, mutable.Set[Int]]) : List[Node] = {
lazy val nodeMap = edgeMap map (kv => (kv._1, new Node(kv._1, futures.get(kv._1).get)))
lazy val futures : Map[Int, Set[Node]] = edgeMap map (kv => {
val edges = (kv._2 map (e => nodeMap.get(e).get)).toSet
(kv._1, edges)
})
val eval = nodeMap.values.toList
eval //to force from lazy to real - don't really like doing this
}

或者,从边缘列表中选择

//reads an edgeList into a graph
def readEdgelist(filename : String) : List[Node] = {
lazy val nodes = new mutable.HashMap[Int, Node]()
lazy val edges = new mutable.HashMap[Int, mutable.Buffer[Node]]()
Source.fromFile(filename).getLines() filter (x => x != None) foreach {edgeStr =>
val edge = edgeStr.split('\t')
if (edge.size != 2) goodbye("Not a well-formed edge : " + edgeStr + " size: " + edge.size.toString)
val src = edge(0).toInt
val des = edge(1).toInt
if (!(nodes.contains(src))) nodes.put(src, new Node(src, futures.get(src).get))
if (!(nodes.contains(des))) nodes.put(des, new Node(des, futures.get(des).get))
edges.put(src, edges.getOrElse(src, mutable.Buffer[Node]()) += nodes.get(des).get)
}
lazy val futures : Map[Int, Set[Node]] = nodes map {node => (node._1, edges.getOrElse(node._1, mutable.Buffer[Node]()).toSet)} toMap
val eval = nodes.values.toList
eval
}

谢谢大家的建议!

最佳答案

听起来你需要自下而上地工作

val b = Node(1, Set.empty)
val c = Node(2, Set.empty)
val a = Node(3, Set(b, c))

希望对你有帮助

关于scala - Scala 中带有列表的递归类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com