無向グラフを作成する必要があります。あまり派手なことをする必要はありませんが、理想的には次のように機能します。
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] *)
これらの関係をモデル化するための 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)
エラー
私がする時
構造体 UDG = UndirectedGraphFn(構造体 タイプ ノード = int val 比較 = Int.compare val 形式 = Int.toString 終わり) UDG.addEdge (UDG.empty,1,2)
タイプの不一致が発生します:
エラー: 演算子とオペランドが一致しません [リテラル] オペレーター ドメイン: UDG.graph * ?.UDG.node * ?.UDG.node オペランド: UDG.graph * int * int 式で: UDG.addEdge (UDG.empty,1,2)