Как можно использовать исключения в 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
в надежде упростить код, но я получил большой беспорядок. Есть предложения?