es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede representar una restricción de igualdad como una restricción personalizada.

Tengo una declaración de tipo de función:

f :: MonadHandler m => SqlPersistT m ()

Que quiero convertir a:

f :: MonadHandlerDB m => m ()

Intento todo lo que se me ocurre para definir la restricción MonadHandlerDB, pero no logro hacer que tanto eso como la declaración de tipo de función se compilen, por ejemplo:

class (forall a . (MonadHandler m, m ~ SqlPersistT a)) => MonadHandlerDB m

class MonadHandlerDB m
instance MonadHandler a => MonadHandlerDB (SqlPersistT a)

type MonadHandlerDB m = forall a . (MonadHandler a, m ~ SqlPersistT a)

type MonadHandlerDB = forall a . (MonadHandler a => m ~ SqlPersistT a)

type MonadHandlerDB m = forall a . (MonadHandler a => m ~ SqlPersistT a)

Uno de los errores:

No se pudo hacer coincidir el tipo `m' con `ReaderT backend0 m0'
`m' es una variable de tipo rígida ligada por
la firma de tipo para:
  f :: forall (m :: * -> *).
       MonadHandlerDB m =>
       m ()

SqlPersistT está definido como:

type SqlPersistT = ReaderT SqlBackend

¿Cómo expreso esta restricción?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en cómo se define SqlPersistT. Se define como “type SqlPersistT = ReaderT SqlBackend”, pero la restricción MonadHandlerDB busca un parámetro de tipo m que satisfaga “m ~ SqlPersistT a”.

    Para resolver esto, podrías definir un nuevo tipo, digamos SqlPersistHandler, que envuelva a SqlPersistT y definir la restricción MonadHandlerDB en términos de ese nuevo tipo:

    newtype SqlPersistHandler m a = SqlPersistHandler (SqlPersistT m a)
    
    instance MonadHandler m => MonadHandlerDB (SqlPersistHandler m) where
      -- define las funciones para MonadHandlerDB utilizando SqlPersistHandler en lugar de SqlPersistT
    

    Luego, puedes actualizar la declaración de tipo de la función para utilizar SqlPersistHandler:

    f :: MonadHandlerDB m => SqlPersistHandler m ()
    

    Esto debería compilar sin errores.

Comments are closed.