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?
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:
Luego, puedes actualizar la declaración de tipo de la función para utilizar SqlPersistHandler:
Esto debería compilar sin errores.