Haskell не может сопоставить тип, утверждает жесткую переменную

Я новичок в 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

Как лучше всего выполнить то, что я пытаюсь достичь?

5
задан Jordan Kay 7 June 2011 в 02:18
поделиться