我有一个名为Graph的数据类型,它长这样:
data Graph w = Graph {vertices :: [(Char, w)],
edges :: [(Char, Char, w)]} deriving Show
这代表了一个有向无环图。其中顶点具有字符标识符(第一个添加的为'a',第二个为'b'等),以及权重。边是两个顶点标识符和一个权重。
我在考虑使顶点变得更加复杂,也许它们应该包含所有邻居的列表?
目前拓扑排序如下:
topological_ordering :: Graph w -> [Char]
topological_ordering (Graph v w) =
let startingNodes = getStartNodes (Graph v w)
emptyList = []
sorted = sortAlgorithm startingNodes emptyList (Graph v w)
in sorted
sortAlgorithm :: [Char] -> [Char] -> Graph w -> [Char]
sortAlgorithm startingNodes sorted (Graph v w) =
| [] _ _ = []
| (x:startingNodes) sorted (Graph v w) =
let sorted = sorted ++ [x]
neigbours = findNeighbours (Graph v w) x
getStartNodes :: Graph w -> [Char]
getStartNodes (Graph v w) =
let set1 = Set.fromList $ firstNodes w
set2 = Set.fromList $ secondNodes w
startNodes = Set.toList $ Set.difference set1 set2
in startNodes
firstNodes :: [(Char, Char, w)] -> [Char]
firstNodes [] = []
firstNodes (x:xs) = selectFirst x:firstNodes xs
secondNodes :: [(Char, Char, w)] -> [Char]
secondNodes [] = []
secondNodes (x:xs) = selectSecond x:secondNodes xs
从那里开始,我有点迷茫。我不知道如何完成 sortAlgorithm,因为我想要它是递归的(或使用 foldl/foldr?)。我应该用另一种方式实现图形的数据类型,还是应该继续使用这个?
我几周前刚刚开始学习 Haskell,对于函数式编程仍然感到有点迷茫。
谢谢。