Я играю с corecursive структурами данных, и довольно рано в моем коде я получаю ошибку типа:
module Graph where
import Data.Map
data Node a = Node { getLabel :: a, getInEdges :: [Edge a], getOutEdges :: [Edge a] }
data Edge a = Edge { getStart :: Node a, getEnd :: Node a }
data Graph a = Graph { getNodes :: [Node a], getEdges :: [Edge a] }
mkGraph :: (Ord a) => [(a,a)] -> Graph a
mkGraph pairs = Graph (elems nodes) edges
where nodes :: Map a (Node a)
edges :: [Edge a]
(nodes, edges) = foldr addEdge (empty,[]) pairs
addEdge :: (a,a) -> (Map a (Node a), [Edge a]) -> (Map a (Node a), [Edge a])
addEdge (startLabel, endLabel) = undefined
Когда я пытаюсь загрузить это в ghci
, я получаю
graph.hs:13:25:
Couldn't match expected type `forall a. Map a (Node a)'
against inferred type `Map a (Node a)'
Expected type: (forall a1. Map a1 (Node a1), forall a1. [Edge a1])
Inferred type: (Map a (Node a), [Edge a])
In the expression: foldr addEdge (empty, []) pairs
In a pattern binding:
(nodes, edges) = foldr addEdge (empty, []) pairs
Если я удаляю сигнатуры типов nodes :: Map a (Node a)
и edges :: [Edge a]
, ошибка исчезает.
Что я здесь не так делаю?Я предполагаю, что переменная типа a
не связана с сигнатурой типа mkGraph
, но определение mkGraph не должно заставлять a
в сигнатуре nodes
и edges
быть таким же a
?