Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 不能';t匹配类型‘;持久性后端U’;与‘;SqlBackend’;_Haskell_Haskell Persistent - Fatal编程技术网

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。