質問

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 msgmsgを交換すると、それを修正する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top