2009-06-03 27 views
6

Tôi có một chức năng để kiểm tra liệu một loại là một subtype của loại hình khác:Lỗi xử lý trong Haskell với Hoặc đơn nguyên

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)) 

tôi muốn làm xử lý lỗi. Tôi có định nghĩa sau:

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

Thỉnh thoảng tôi có thể xử lý lỗi bằng cách xử lý kết quả của st. Ví dụ, hàm sau hoạt động, và được tôi các thông điệp mà là kết quả của cách gọi "thất bại" trong st:

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

Bây giờ, tôi bên st và tôi muốn đệ quy gọi nó. Đối với một số lý do, đoạn code sau, lồng nhau sâu trong 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 

Không gõ kiểm tra, nhưng mang lại cho tôi những lỗi sau:

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)) 

Tại sao điều trị kết quả của st như Dù công việc bên ngoài của 'st' nhưng không phải bên trong? Làm thế nào tôi có thể thay đổi mã của tôi sao cho nó hoạt động bên trong?

+3

Dường như bạn đang triển khai lại [Control.Monad.Error] (http://www.haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Error.html)? – ephemient

Trả lời

5

Tôi nghĩ rằng vấn đề là bạn gọi show msg nơi bạn chỉ nên sử dụng msg. Kết quả là, trình biên dịch không thể suy ra rằng bạn có nghĩa là Either String; tất cả những gì bạn biết là bạn có Either t nơi mà các ràng buộc Show t là hài lòng. Thay thế show msg bằng msg nên khắc phục.