Отказ от ответственности: ниже приведено в основном бессмысленное упражнение в технике «завязывания узла».Fgl - это путь, если вы действительно хотите использовать свои графики.Однако, если вам интересно, как можно функционально представлять циклические структуры данных, читайте дальше.
Довольно просто представить граф в Haskell!
-- a directed graph
data Vertex a b = Vertex { vdata :: a, edges :: [Edge a b] }
data Edge a b = Edge { edata :: b, src :: Vertex a b, dst :: Vertex a b }
-- My graph, with vertices labeled with strings, and edges unlabeled
type Myvertex = Vertex String ()
type Myedge = Edge String ()
-- A couple of helpers for brevity
e :: Myvertex -> Myvertex -> Myedge
e = Edge ()
v :: String -> [Myedge] -> Myvertex
v = Vertex
-- This is a full 5-graph
mygraph5 = map vv [ "one", "two", "three", "four", "five" ] where
vv s = let vk = v s (zipWith e (repeat vk) mygraph5) in vk
Это циклический, конечный, рекурсивная, чисто функциональная структура данных.Не очень эффективный или красивый, но смотрите, ма, никаких указателей!Вот упражнение: включите входящие ребра в вершину
data Vertex a b = Vertex {vdata::a, outedges::[Edge a b], inedges::[Edge a b]}
Легко построить полный граф, который имеет две (неразличимые) копии каждого ребра:
mygraph5 = map vv [ "one", "two", "three", "four", "five" ] where
vv s =
let vks = repeat vk
vk = v s (zipWith e vks mygraph5)
(zipWith e mygraph5 vks)
in vk
, но попробуйте построитьтот, у которого есть одна копия каждого!(Представьте, что в e v1 v2
участвуют дорогостоящие вычисления).