Быстрая реализация двоичного дерева Haskell

Я реализовал структуру данных двоичного дерева в 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, может, я могу сделать мою реализацию двоичного дерева более эффективной?

Спасибо.

5
задан 0xAX 22 July 2011 в 16:43
поделиться