どちらのモナドとHaskellでのエラー処理
-
09-09-2019 - |
質問
I型は別の型のサブタイプであるかどうかをチェックする機能を有している:
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
時々私はどちらかと目の結果を処理することにより、エラー処理を行うことができます。たとえば、以下の機能が働き、そして私の目の内側に「失敗」を呼び出すに起因するメッセージを取得します:
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」の外ではなく、どちらかと目の結果を処理するのでしょうか?どのように私はそれがあまりにも、内部に動作するように私のコードを変更することができますか?
解決
私はこの問題は、あなたがちょうどshow msg
を使用する必要がありますmsg
を呼び出すことだと思います。その結果、コンパイラはあなたがEither String
を意味することを推測することはできません。それは知っているすべては、制約Either t
が満たされている場所をShow t
していることです。 show msg
でmsg
を交換すると、それを修正する必要があります。
所属していません StackOverflow