&引用;类型变量不明确";在Haskell Yesod中具有持久性

&引用;类型变量不明确";在Haskell Yesod中具有持久性,haskell,type-inference,yesod,persistent,typechecking,Haskell,Type Inference,Yesod,Persistent,Typechecking,我正在尝试使用Persistent with Yesod从数据库中的表中获取所有字段键的列表。我的访问者代码如下: getMapList :: Handler [Text] getMapList = runDB $ do dbList <- selectList [] [] return (map getMapName dbList) where getMapName (Entity (Key (PersistText mapName)) _) = mapName 我认为您

我正在尝试使用Persistent with Yesod从数据库中的表中获取所有字段键的列表。我的访问者代码如下:

getMapList :: Handler [Text]
getMapList = runDB $ do
  dbList <- selectList [] []
  return (map getMapName dbList)
  where getMapName (Entity (Key (PersistText mapName)) _)  = mapName

我认为您需要添加过滤器类型签名,它基于您在别处定义的表(我不确定您是否试图避免在某处键入列名……我不确定这是否可行)

这对你有用吗?如果表定义为-

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
KingsLadiesInWaiting
    name String
    skillLevel Int
    deriving Show
|]
加上-

getMapList :: Handler [T.Text]
getMapList = runDB $ do
  dbList <- selectList ([]::[Filter (KingsLadiesInWaitingGeneric backend)]) []
  return (map getMapName dbList)
  where getMapName (Entity (Key (PersistText mapName)) _)  = mapName
getMapList::Handler[T.Text]
getMapList=runDB$do

dbList我用GameMapGeneric而不是KingsLadiesInWaitingGenerc尝试了这一点,得到了以下错误:不在范围内:类型构造函数或类“GameMapGeneric”。有什么特别的东西我需要进口吗?我使用的是一个搭建的站点,所以我把它分散在一堆文件中,我的处理程序都在各自的文件中。当你运行“yesod init”时,它应该创建一个名为Model.hs的文件,你需要使用函数将其导入到文件中。实际模型应该在config/models中,因此您还可以验证表“GameMap”是否存在。我仍然会得到错误,并且在执行“导入模型(GameMapGeneric)”时,会得到“模块“Model”没有导出“GameMapGeneric”。有什么想法吗?非常感谢到目前为止所有的帮助。好消息/坏消息。。。。好消息是——我使用“ghc--show iface Model.hi”检查了Model.hs创建的数据类型,并且能够找到实际创建的类型(只是表名,末尾没有Generic一词)。它跑了。坏消息是,输出不是您期望的。它不是列名,而是列值。我可能会玩更多的游戏,试着找出是否有其他方法来获取列名。整理好了,这有点麻烦,但我在选择过滤器列表中添加了一个简单的条件,而不是[],这足以让typechecker弄清楚这一切。
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
KingsLadiesInWaiting
    name String
    skillLevel Int
    deriving Show
|]
getMapList :: Handler [T.Text]
getMapList = runDB $ do
  dbList <- selectList ([]::[Filter (KingsLadiesInWaitingGeneric backend)]) []
  return (map getMapName dbList)
  where getMapName (Entity (Key (PersistText mapName)) _)  = mapName