2013-11-06 3 views
1

Таким образом у меня есть эта структура данных:Бинарные деревья Haskell

class ordering a where 

    order :: a-> Int 

И я хочу, чтобы создать дерево поиска, где каждый узел представляет собой список элементов, определяется их собственным номером заказа (корень 1, корень левого поддерева равно 2, корень правого поддерева равен 3 и т. д.). Каждый тип данных, вставленный в дерево, имеет связанный с ним номер «порядка», который имеет значение только для «целей вставки дерева», и если он равен 1, он остается в корне, если он равен двум, он остается на левой стороне дерева, и так далее ..

Вот моя попытка это:

data Tree a = EmptyTree 
     | Node a order a (Tree [a]) (Tree [a]) deriving (Show, Read, Eq) 

Что я сделал, имеет смысл для меня, но, видимо, не так, но если честно я есть не знаю, почему ...

Я новичок в Haskell, и я изо всех сил пытаюсь выучить язык, поэтому я ценю любую помощь от вас, ребята!

+1

Возможный дубликат [Указание ограничений класса в конструкторах значений] (http://stackoverflow.com/questions/4810274/specifying-class-constraints-in-value-constructors) –

+2

Я думаю, проблема в том, что вы смешиваете значение _types_, 'data', _type classes_ и _classes в языках OO (что совершенно нормально для начинающих Haskellers). Прочитайте некоторые [книги (ы) на Haskell] (http://www.haskell.org/haskellwiki/Books#Textbooks), это, вероятно, будет самым эффективным решением вашей проблемы. – leftaroundabout

+1

1) имена классов должны быть написаны заглавными буквами. 2) 'Ordering' является занятым именем в Prelude, попробуйте использовать другое имя для класса 3) данные и класс связаны через' instance' – viorior

ответ

1

ordering, который вы определили, является классом типа, а не структурой данных. order - это операция, а не тип. Помещение операции order в структуру данных Tree бессмысленно.

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

+0

Я пытаюсь сначала написать структуру, поэтому я могу сделать функцию, чтобы добавить некоторые данные позже :) –

+0

@dcarou: разумно сначала указать типы данных перед _implementing_ любой функцией, но по крайней мере вы должны знать, что такое _type signature_ этих функций. – leftaroundabout

+0

Вы правы! Итак, в основном, чтобы решить эту проблему, как я могу использовать атрибут типа «порядок» в определении дерева? Поскольку каждый тип данных имеет номер заказа, связанный с ним, поэтому его можно вставить в нужное положение в дереве –

1

Начнем с функции на самом деле. Видимо, вы хотите:

insert :: Ord key => (key,val) -> Tree key val -> Tree key val 

, поскольку ваше дерево несет значения, которые должны быть вставлены в соответствии с ключами, этот Tree тип необходимо заключить их обоих:

data Ord key => Tree key val = EmptyTree 
          | Node key val (Tree key val) (Tree key val) 

теперь это легко реализовать функцию insert , Каждое дерево типа Tree key val сможет нести ключи типа key и значения типа val. Для того, чтобы приспособить для различных конкретных типов значений в одном дереве можно использовать маркированный тип накидного для него:

data Myval = My_c1 | My_c2 | MyInt Int | MyInts [Int] | MyString String | ... 

теперь дерево типа, например, Tree Int Myval будет нести значения, помеченные Myval конструкторов, вставленный в соответствии с предоставленным пользователем Int ключей.

Если вы имеете в виду, что каждый тип данных имеет свой собственный ключ,

ordkey :: Myval -> Int 
ordkey My_c1 = 1 
ordkey My_c2 = 2 
ordkey (MyInt _) = 3 
.... 

тогда вы не будете использовать insert напрямую, а через посредника,

ordinsert val tree = insert (ordkey val,val) tree 

Это, конечно, простой, неискушенный способ обойти это, возможно, это то, что вы имели в виду.

+0

Что я имел в виду, так это то, что код должен быть совместим с каждым типом данных (int, char, string и т. Д.). ..). и что каждый узел должен быть списком, поэтому разные данные с одним и тем же командным ключом вставлены в одно и то же место –

+0

@dcarou ah, что «нечто отличное от того, что я показываю, но похожее. вы хотите '| Node key val (Tree key [val]) (Tree key [val]) 'и' insert' будет означать новый элемент поверх списка, который уже существует. Но тогда каждый элемент в '[val]' будет одного типа ... –

+0

Точно все элементы должны быть одного и того же типа, но дерево должно поддерживать любой тип данных. Но вы можете показать это, так что я могу лучше понять, что происходит на самом деле? –

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