Haskell 不能';t匹配类型‘;持久性后端U’;与‘;SqlBackend’;
以下代码产生编译错误Haskell 不能';t匹配类型‘;持久性后端U’;与‘;SqlBackend’;,haskell,haskell-persistent,Haskell,Haskell Persistent,以下代码产生编译错误无法将类型“PersistEntityBackend U”与使用“insertUser”时产生的“SqlBackend”匹配,原因是注释行: sampleUser :: Entity User sampleUser = Entity (toSqlKey 1) $ User { userName = "admin" , userEmail = "admin@test.com" } type U = Entity User connectInfo :: MySQL
无法将类型“PersistEntityBackend U”与使用“insertUser”时产生的“SqlBackend”匹配,原因是注释行:
sampleUser :: Entity User
sampleUser = Entity (toSqlKey 1) $ User
{ userName = "admin"
, userEmail = "admin@test.com"
}
type U = Entity User
connectInfo :: MySQLConnectInfo
connectInfo = undefined
runAction :: (MonadUnliftIO m, IsPersistBackend r, BaseBackend r ~ SqlBackend) => MySQLConnectInfo -> ReaderT r (LoggingT m) a -> m a
runAction connectInfo action = runStdoutLoggingT $ withMySQLConn connectInfo $ \backend ->
runReaderT action backend
insertUser :: (PersistEntity U, PersistRecordBackend U SqlBackend) =>
U -> ReaderT SqlBackend (LoggingT IO) (Key U)
insertUser = insert
doDBStuff :: IO ()
doDBStuff = do
runAction connectInfo (runMigration migrateAll)
runAction connectInfo (insertUser sampleUser) -- compile error
return ()
就我所见,我已经专门化了insertUser
中的所有类型,并添加了所有必要的约束(阅读了本文)。我缺少什么?您有一个PersistRecordBackend U SqlBackend
约束,我不知道您是否需要,但我怀疑您需要PersistEntityBackend U~SqlBackend
约束,用于insertUser
。或者是编译器建议的那样
请参见询问ghci:info User
给了我一个正确的提示:它显示了它的类实例。事实证明,直接使用实体用户
是错误的。我怀疑在创建实体时,Database.Persist.TH.share
生成的所有类实例都丢失了。以下代码编译,同时删除了Bjartur提到的冗余约束:
sampleUser :: User
sampleUser = User
{ userName = "admin"
, userEmail = "admin@test.com"
}
type U = User
connectInfo :: MySQLConnectInfo
connectInfo = undefined
runAction :: (MonadUnliftIO m, IsPersistBackend r, BaseBackend r ~ SqlBackend) => MySQLConnectInfo -> ReaderT r (LoggingT m) a -> m a
runAction connectInfo action = runStdoutLoggingT $ withMySQLConn connectInfo $ \backend ->
runReaderT action backend
insertUser :: (PersistRecordBackend U SqlBackend) =>
U -> ReaderT SqlBackend (LoggingT IO) (Key U)
insertUser = insert
doDBStuff :: IO ()
doDBStuff = do
runAction connectInfo (runMigration migrateAll)
runAction connectInfo (insertUser sampleUser) -- compile error fixed
return ()
错误依然存在;我的印象是,persistenitybackend U~SqlBackend
已经包含在persisterrecordbackend U SqlBackend
约束别名中。你完全正确,正如我们链接的问答的附录中所示。我应该在把这个问题当作重复问题而不予理睬之前读得更深入一些。因此,您对insertUser类型的PersistEntity U约束是多余的。干得好!我同意你的观点,这个错误源于没有针对U。