с предзаказом для обхода IntTree - PullRequest
2 голосов
/ 23 апреля 2019

Я пытаюсь создать функцию предварительного заказа для обхода IntTree.

Класс Tree выглядит следующим образом

data IntTree = Empty | Branch IntTree Int IntTree deriving (Show, Eq)

У меня два вопроса 1. Я получаю ошибки, как показано ниже.

E:\Haskell\Uebungsblatt_2_Aufgabe_2_a.hs:7:14: error:
    * Expected kind `* -> Constraint', but `IntTree' has kind `*'
    * In the type signature: preorder :: (IntTree c) => c -> [a]
  |
7 | preorder :: (IntTree c) => c->[a]

  |              ^^^^^^^^^
[Finished in 0.5s]

Я не понимаю, почему.Они произошли в этой следующей строке

preorder :: (IntTree c) => c->[a]

Я думаю, что следующая строка не верна.Я думаю, что мне нужно написать другие выражения вместо «l: preorder a: preorder r: []»

preorder Branch a l r = l : preorder a : preorder r:[]

Благодарю вас заранее за помощь !!

main :: IO ()    -- This says that main is an IO action.
main = return () -- This tells main to do nothing

data IntTree = Empty | Branch IntTree Int IntTree deriving (Show, Eq)


preorder :: (IntTree c) => c->[a]
preorder Empty = []
preorder Branch Empty x Empty = [x]
preorder Branch a l r = l : preorder a : preorder r:[]

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

На вопрос 1:

preorder :: (IntTree c) => c->[a]

Вы путаете классы и типы данных. IntTree было объявлено с data, так что это не класс типов, а обычный тип данных, например Bool или Int. Используется так же:

preorder :: IntTree -> [a]

Во-вторых, вы не возвращаете список любого типа a (строчные буквы имеют тип переменные ), вы возвращаете именно список Int s, потому что это то, что Дерево содержит Итак, вы должны сказать так:

preorder :: IntTree -> [Int]
2 голосов
/ 23 апреля 2019

Для вопроса 1: подпись

preorder :: (IntTree c) => c->[a]

неверно: IntTree не класс типов, это простой тип, поэтому мы можем использовать его как есть.

preorder :: IntTree -> [Int]

Последний тип должен быть Int, так как мы создаем список целых чисел, а не список [a] для любого a.

Для вопроса 2: : добавляет элемент к списку , имеет тип

(:) :: a -> [a] -> [a]

Следовательно, он не объединяет два списка. Для этого используйте вместо

(++) :: [a] -> [a] -> [a]

как в

preorder (Branch a l r) = l : preorder a ++ preorder r

(нет необходимости использовать ++ [] в конце)

...