Я новичок в Haskell, и я пытаюсь создать класс типов для графиков и узлов в них. Поскольку мне нужны как ориентированные, так и неориентированные графы, у меня есть
data Node = Node { label :: Char
, index :: Int
} deriving (Ord, Eq)
type Graph edgeType = ([Node], [edgeType])
data Edge = DirectedEdge {h :: Node, t :: Node}
| UndirectedEdge {a :: Node, b :: Node}
instance Show Node where
show n = ['(', label n, ')']
instance Show Edge where
show (DirectedEdge h t) = show h ++ "->" ++ show t
show (UndirectedEdge a b) = show a ++ "-" ++ show b
Итак, я различаю направленные и ненаправленные края. Граф должен иметь только ребра любого типа. У меня также есть следующее:
nodes :: [Node]
nodes = zipWith Node ['a'..] [0..]
emptyGraph :: [Node] -> Graph edgeType
emptyGraph ns = (ns, [])
Пока все хорошо, но я пишу функцию connect
, которая соединяет узел с существующим графом. В идеале я хочу, чтобы он применялся только к неориентированным графам, но это не вариант. Вместо этого у меня есть что-то вроде этого:
connect :: Graph edgeType -> Node -> Graph edgeType
connect (ns, es) n = (n:ns, e:es)
where e = UndirectedEdge n (head ns)
Но это дает следующую ошибку:
Couldn't match type `edgeType' with `Edge'
`edgeType' is a rigid type variable bound by
the type signature for
connect :: Graph edgeType -> Node -> Graph edgeType
Как лучше всего достичь того, чего я пытаюсь достичь?