2009-06-03 3 views
6

У меня есть функция, которая проверяет тип является ли подтипом другого типа:Обработка ошибок в Haskell либо с монады

st :: Monad m => Map String Type -- ^type environment 
    -> Set (Type, Type) -- ^assumed subtypes 
    -> (Type, Type) -- ^we are checking if lhs <: rhs  
    -> m (Set (Type, Type)) 

Я хочу, чтобы сделать обработку ошибок. У меня есть следующее определение:

instance Monad (Either String) where 
    return v = Right v 
    fail s = Left s 
    (Left s) >>= _ = Left s 
    (Right v) >>= f = f v 

Иногда я могу выполнять обработку ошибок, обрабатывая результат st как любой. Например, следующая функция работает, и получает мне сообщения, которые являются результатом вызова «сбой» в ст:

isSubType env cs t1 t2 = result where 
    result = case st env (S.empty) (t1, t2) of 
    Left msg -> Left msg 
    Right rel -> Right() 

Теперь я внутри й, и я хочу, чтобы рекурсивно называть. По какой-то причине, следующий код, вложенным глубоко в St:

let do_t1 rel t1 = case st env rel (t1, t2) of 
     Left msg -> fail $ printf "type %s in the union is not a subtype\ 
          \ of the rhs, %s, because: %s" (renderType t1) 
          (renderType t2) (show msg) 
     Right rel -> return rel 

Не тип проверки, но дает мне следующую ошибку:

No instance for (Monad (Either t)) 
     arising from a use of `st' 
        at src/TypedJavaScript/Types.hs:386:24-42 
    Possible fix: add an instance declaration for (Monad (Either t)) 

Почему лечащему результат ЗБ как работают либо за пределами из 'st', но не внутри? Как я могу изменить свой код так, чтобы он работал внутри?

+3

Возможно, вы перепрограммируете [Control.Monad.Error] (http://www.haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Error.html)? – ephemient

ответ

5

Я думаю, проблема в том, что вы звоните show msg, где вы должны просто использовать msg. В результате компилятор не может вывести, что вы имели в виду Either String; все, что он знает, это то, что у вас есть Either t, где ограничение Show t выполнено. Замена show msg на msg должна быть исправлена.

 Смежные вопросы

  • Нет связанных вопросов^_^