Если мы создадим и выполняем функцию, которая берет BST и возвращает список в отсортированном порядке, смоделируется после сортировки. нуб, тогда ваше дерево прекрасно, как говорит нам quickcheck. QuickCheck очень прост в использовании.
import Data.List
import Test.QuickCheck
data BST = MakeNode BST String BST
| Empty
deriving (Show)
add :: String -> BST -> BST
add new Empty = (MakeNode Empty new Empty)
add string [email protected](MakeNode left value right)
| string > value = MakeNode left value (add string right)
| string < value = MakeNode (add string left) value right
| otherwise = tree
test = ["alice", "blup", "test", "aa"]
manual_test = inorder (foldr add Empty test) == sort (nub test)
prop_inorder = property inorder_test
where inorder_test :: [String] -> Bool
inorder_test xs = inorder (foldr add Empty xs) == sort (nub xs)
-- return sorted nodes
inorder :: BST -> [String]
inorder (Empty) = []
inorder (MakeNode l x r) = inorder l ++ (x : inorder r)
Просто загрузите ghci, а затем запустите quickCheck prop_inorder.
Другие полезные функции:
reverseOrder :: BST -> [String]
reverseOrder Empty = []
reverseOrder (MakeNode l x r) = reverseOrder r ++ (x : reverseOrder r)
asList :: BST -> [String]
asList Empty = []
asList (MakeNode l x r) = x : (asList l ++ asList r)
А также думать о том, чтобы ваше дерево более общее, параметризуя больше:
data BST a = Empty | MakeNode (BST a) a (BST a)
Вы можете сделать это, чем экземпляр функтора, Монады, откидное и всевозможные удобные модели.
Что не так с ним точнее? Мне кажется хорошо. –
плохо показать вам выход. – user1204349