Доброе время суток.
Задаваясь вопросом о графах, я не сумел найти адекватное представление оных для случая, когда имена вершин не имеют значения.
То есть, если работать с именами можно и нужно - то годится такой вариант:
data Grath name vortex = Net [(name, vortex)] [([name], name)]
Когда граф - список пар имя-вершина и список всех возможных переходов и всех вершин (вместо списков можно использовать любые хранилища данных).
Однако иногда хочется, чтобы граф определялся как дерево (а не заменять имена на номера):
data Tree a = Node a [Tree a]
То есть акцент делается на взаимосвязях, а имена опускаются. Но так не удобно работать с циклами (а они вообще вроде-бы так не представимы (поправьте если я не прав)). И вот тут возникает проблема.
Пока самое лучшее, что я смог придумать - выделение в графе элементарных циклов (внутри которых нет других циклов) и абстракция оных в единый элемент:
data Grath a = Singleton a [Grath a] | Cycle Представление кругового списка над (Grath a)
Однако и тут не все так гладко, так как идея сырая и возникает проблема с представлением элементарных циклов со смежными гранями.