Я реализовал структуру данных двоичного дерева в Haskell.
Мой код:
module Data.BTree where
data Tree a = EmptyTree
| Node a (Tree a) (Tree a)
deriving (Eq, Ord, Read, Show)
emptyTree :: a -> Tree a
emptyTree a = Node a EmptyTree EmptyTree
treeInsert :: (Ord a) => a -> Tree a -> Tree a
treeInsert x EmptyTree = emptyTree x
treeInsert x (Node a left right)
| x == a = (Node x left right)
| x < a = (Node a (treeInsert x left) right)
| x > a = (Node a left (treeInsert x right))
fillTree :: Int -> Tree Int -> Tree Int
fillTree 10000 tree = tree
fillTree x tree = let a = treeInsert x tree
in fillTree (x + 1) a
Этот код очень медленный. Я запускаю:
fillTree 1 EmptyTree
Я получаю: 50,24 секунды
Я пытаюсь реализовать этот код на языке C, и мой результат этого теста: 0m0.438s
Почему такая большая разница? Код Haskell работает так медленно или мое двоичное дерево в haskell плохо? Я хочу спросить гуру haskell, может, я могу сделать мою реализацию двоичного дерева более эффективной?
Спасибо.