2016-03-20 2 views
0

В Haskell я могу делать такие вещи, какHaskell определения дерева

a :: Int 
a = 15 

У меня есть тип данные, как показано ниже

data Btree a = ND | Data a | Branch (Btree a) (Btree a) deriving (Show, Eq) 

Как определить дерево, не используя функции, такие, как указано выше ,

Я пробовал;

tree :: BTree 
tree = Branch Btree (Branch ND Data 1) (Branch ND (Branch ND ND)) 

Я не могу заставить его работать (я новичок в Haskell, так что если это очень простой, я заранее извиняюсь)

ответ

3

Имейте в виду, что для построения экземпляра данных типа вам нужно для вызова одной из его конструкторских функций. Все эти конструкторы, ND, Data, Branch, являются просто регулярными функциями, поэтому их следует называть как таковые.

В вашем tree вы смешиваете типы данных (Btree) с конструкторами, в то время как вы должны использовать только конструкторы. Кроме того, имейте в виду, что вызов функции («оператор пространства» связан с левым) очень жадный, поэтому Branch ND Data 1 вызывает функцию Branch с 3 аргументами, а не то, что вы хотите: Branch ND (Data 1).

Итак, чтобы создать дерево глубины 2 с учетом выше, вы пишете:

tree = Branch (Branch ND (Data 1)) (Branch ND (Branch ND ND)) 
2

Обратите внимание, что Data 1 будет ВТКЕЙ, а также без какого-либо дополнительного багажа

Prelude> :t (Data 1) 
(Data 1) :: Num a => Btree a 

если вы хотите простой ветвь с правом элемента только вы можете написать

Branch ND (Data 1) 

или двухуровневый d как и в другом ответе. В этот момент удобные функции конструктора будут удобны для минимизации шума и ввода текста.

Смежные вопросы