риффов на абсолютно правильный ответ m0nhawk, я бы предложил следующий совет. Когда вы пишете функцию, которая соответствует шаблону по типу алгебраических данных, например Tree
, начните с написания шаблона о том, как будет структурирована функция. В этом случае, учитывая определение типа:
data Tree a = Leaf a | Node (Tree a) a (Tree a) deriving (Eq, Show)
... и эта подпись функции:
treeToList :: (Ord a) => Tree a -> [a]
... вы можете начать с написания шаблона, как этот, который только расширяется из две альтернативы в Tree
типа и их компоненты:
treeToList (Leaf value) = _
treeToList (Node left value right) = _
Прочитайте _
(подчеркивание), как «пробелы», чтобы заполнить позже. Это действительно правильный синтаксис в последних версиях GHC, называемый «дырой», поэтому компилятор вам напомнит, что вам нужно его заполнить.
Выписывая шаблон, подобный этому, и убедитесь, что вы покрываете все альтернативы типа, с которым вы работаете, значительно уменьшают риск столкновения с проблемой № 1, о которой указал m0nhawk.
В будущем сообщение об ошибке или неверный вывод, который вы получите, полезны тем, кто отвечает на ваши вопросы. – luqui
Какова цель ограничения Ord? Это необязательно, это часть вашего решения или часть вашего задания? 'treeToList :: Tree a -> [a]' достаточно. – Franky