У меня возникли проблемы с моим назначением: я пытаюсь написать код, который составляет список всех значений узлов, которые я ему скажу (например, все узлы со значением 4 в аккуратный список).Haskell Tree - поиск по дереву
я написал следующее:
findValue :: a -> (MyTree a) -> [a]
findValue x Leaf = []
findValue x (Node a l r)
|a == x = x++(findValue x l)++(findValue x r)
|a /= x = (findValue x l)++(findValue x r)
Я определил деревья следующим образом:
data MyTree a = Leaf | Node a (MyTree a) (MyTree a)
Я получаю следующее сообщение об ошибке-сообщение:
Couldn't match expected type ‘[a]’ with actual type ‘a’
‘a’ is a rigid type variable bound by
the type signature for findValue :: a -> MyTree a -> [a]
at assignment.hs:10:14
Relevant bindings include
r :: MyTree a (bound at assignment.hs:12:25)
l :: MyTree a (bound at assignment.hs:12:23)
a :: a (bound at assignment.hs:12:21)
x :: a (bound at assignment.hs:12:11)
findValue :: a -> MyTree a -> [a]
(bound at assignment.hs:11:1)
In the first argument of ‘(++)’, namely ‘x’
In the expression: x ++ (findValue x l) ++ (findValue x r)
Я был бы очень рад если кто-то объяснил мне сообщение об ошибке. Заранее спасибо!
Спасибо вам ответить! Когда я прочитал «Не удалось совместить ожидаемый тип» [a] 'с фактическим типом «a», я подумал: «Хорошо, где-то есть элемент, где должен быть список», я посмотрел на свой код, не сделал найти ошибку, где он сказал мне: «В первом аргументе f '(++)», а именно «x», потому что я подумал: «Но я сказал x == a, почему внезапно x не так, он становится конкатенированным в список, так что это список в конце, а не голый элемент. Может быть, я перепутал его в другом месте, и теперь Хаскелл не может прочитать мою строку. Может быть, это синтаксис. О, человек, я должен спросить, я понятия не имею ». – redrenoir