And*_*ton 6 structure graph sml functor data-structures
我需要构建一个无向图.我不需要它做任何太花哨的事情,但理想情况下它会像这样工作:
structure UDG = UndirectedGraph
val g = UDG.empty
val g = UDG.addEdges(g, n1, [n2, n4, n7]) (* n1 is connected to n2, n4, and n7 *)
val g = UDG.addEdge(g, n2, n3)
UDG.connected(g, n2) (* returns [n1, n3] *)
Run Code Online (Sandbox Code Playgroud)
SML/NJ中是否有良好的数据结构来建模这些关系?我应该自己滚吗?
我已经继续尝试滚动自己,但是当我尝试测试它时,我遇到类型不匹配错误.我对SML结构和仿函数的经验非常基础,所以我认为我做的事情显然是错误的.我如何让它工作?另外,你可以帮我做一个'a graph吗?从语义上看,这似乎更有意义.
signature ORD_NODE =
sig
type node
val compare : node * node -> order
val format : node -> string
end
signature GRAPH =
sig
structure Node : ORD_NODE
type graph
val empty : graph
(* val addEdge : graph * Node.node * Node.node -> graph
* addEdge (g, x, y) => g with an edge added from x to y. *)
val addEdge : graph * Node.node * Node.node -> graph
val format : graph -> string
end
functor UndirectedGraphFn (Node : ORD_NODE) :> GRAPH =
struct
structure Node = Node
structure Key = struct
type ord_key = Node.node
val compare = Node.compare
end
structure Map = BinaryMapFn(Key)
type graph = Node.node list Map.map (* Adjacency list *)
val empty = Map.empty
fun addEdge (g, x, y) = (* snip *)
fun format g = (* snip *)
end
structure UDG = UndirectedGraphFn(struct
type node = int
val compare = Int.compare
val format = Int.toString
end)
Run Code Online (Sandbox Code Playgroud)
当我做
structure UDG = UndirectedGraphFn(struct type node = int val compare = Int.compare val format = Int.toString end) UDG.addEdge (UDG.empty,1,2)
我得到一个类型不匹配:
Error: operator and operand don't agree [literal]
operator domain: UDG.graph * ?.UDG.node * ?.UDG.node
operand: UDG.graph * int * int
in expression:
UDG.addEdge (UDG.empty,1,2)
| 归档时间: |
|
| 查看次数: |
8669 次 |
| 最近记录: |