ich eine Funktion haben, die überprüft, ob ein Typ ein Subtyp eines anderen Typs ist:Fehler in Haskell mit entweder Monade Handhabung
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))
Ich möchte die Fehlerbehandlung tun. Ich habe die folgende Definition:
instance Monad (Either String) where
return v = Right v
fail s = Left s
(Left s) >>= _ = Left s
(Right v) >>= f = f v
Manchmal kann ich Fehlerbehandlung durch Behandlung des Ergebnisses von St als entweder tun. Zum Beispiel kann die folgende Funktion funktioniert, und wird mir die Nachrichten, die von den Aufruf „nicht bestanden“ innerhalb st führen:
isSubType env cs t1 t2 = result where
result = case st env (S.empty) (t1, t2) of
Left msg -> Left msg
Right rel -> Right()
Nun, ich bin innen st und ich möchte es rekursiv aufrufen. Aus irgendeinem Grund, den folgenden Code, verschachtelte tief in 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
überprüfen nicht Typ nicht, aber gibt mir die folgende Fehlermeldung:
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))
Warum entweder als Arbeit das Ergebnis der st nicht die Behandlung von außerhalb von 'st', aber nicht drinnen? Wie kann ich meinen Code so ändern, dass er auch im Inneren funktioniert?
Sie scheinen [Control.Monad.Error] (http://www.haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Error.html) erneut zu implementieren? – ephemient