Чистые исключения в Haskell

Как можно использовать исключения в Haskell без прохождения ввода-вывода ?

У меня есть следующий код для вставки элемента в двоичное дерево поиска с минимальным количеством сравнений и без копирования, когда элемент является членом дерева. Я заметил, что либо используется как catch и Left как throw :

insert x t = either (const t) id (insert' x t Nothing)
    where
    insert' x E m = maybe (Right (T E x E)) (\v -> if x==v then Left E else Right (T E x E)) m
    insert' x t@(T l v r) m = if x<v
                                 then fmap (\l' -> T l' v r) (insert' x l Nothing)
                                 else fmap (\r' -> T l v r') (insert' x r (Just v))

Поэтому я попытался переписать его, используя Control.Monad.Error в надежде упростить код, но я получил большой беспорядок. Есть предложения?

6
задан Don Stewart 23 April 2011 в 22:10
поделиться