Pregunta

Tengo una función que comprueba si un tipo es un subtipo de otro tipo:

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

Quiero hacer el manejo de errores. Tengo la siguiente definición:

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

A veces me puedo hacer el tratamiento de errores al tratar el resultado de pt tampoco. Por ejemplo, la siguiente función funciona, y me pone los mensajes que resultan de la invocación de "falla" dentro de st:

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

Ahora, estoy dentro de st y quiero llamar de forma recursiva ella. Por alguna razón, el siguiente código, anidada profundamente en 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 tipo de comprobación, pero me da el siguiente error:

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

¿Por qué no tratar el resultado de musgo como cualquier trabajo fuera de 'st', pero no en el interior? ¿Cómo puedo cambiar mi código de tal manera que funciona en el interior, también?

¿Fue útil?

Solución

Creo que el problema es que se llama a show msg donde se debe utilizar sólo msg. Como resultado, el compilador no puede deducir que significaba Either String; todo lo que se sabe es que ha Either t donde el Show t restricción es satisfecha. Sustitución show msg con msg debe solucionarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top