2013-04-19 3 views
1

У меня есть этот тип данных:Избавление от ключевого слова Graph в Haskell

data Node a = Node 
    { label :: a, 
     adjacent :: [(a,Int)] } deriving (Show, Eq) 
data Network a = Graph [Node a] deriving (Show, Eq) 

У меня есть функция, которая превращает Graph в список узлов:

deGraph :: ([Node a] -> Network a) -> [Node a] -> [Node a] 
deGraph _ x = x 
for example : 
Main> deGraph Graph [ (Node 'a' [ ('b' , 3) , ('c' ,2) ]) , (Node 'b' [ ('c' , 3) ]) , (Node 'c' []) ] 
[Node {label = 'a', adjacent = [('b',3),('c',2)]},Node {label = 'b', adjacent = [('c',3)]},Node {label = 'c', adjacent = []}] 

Но когда я использую функция внутри функции, как это:

func1 (Graph x) = deGraph (Graph x) 

Я получаю эту ошибку:

ERROR»./Network.hs":14 - Тип ошибки в применении * Выражение: deGraph (график х) Термин: Graph х Тип: Сеть б * Не соответствует: [Узел a] -> Сеть a

Можете ли вы рассказать мне, как я могу решить эту проблему?

ответ

4

Функция deGraph имеет два аргумента и просто возвращает вторую из двух.

Вы, вероятно, хотите вместо этого:

deGraph :: Network a -> [Node a] 
deGraph (Graph x) = x 

Вызов deGraph в GHCi работает, потому что вы забыли поставить скобки вокруг Graph и следующий список, так что это также вызов с двумя аргументами. В func1 вы (правильно) используете круглые скобки, но затем получите ошибку типа, потому что вы несовместимы.

0

Просто сделайте Graph запись, тоже:

data Network a = Graph { nodes :: [Node a] } deriving (Show, Eq) 

Тогда nodes имеет тип Network a -> [Node a], и можно назвать как

Main> nodes $ Graph listOfNodes 
Смежные вопросы