尝试从外部属性列表中检索实体列表时出现以下错误。
Handler/ContactList.hs:21:57:
Couldn't match type `PersistMonadBackend m0'
with `persistent-1.3.0.6:Database.Persist.Sql.Types.SqlBackend'
The type variable `m0' is ambiguous
Possible fix: add a type sig`enter code here`nature that fixes these type variable(s)
Expected type: PersistEntityBackend User
Actual type: PersistMonadBackend m0
In the expression: `enter code here`get
In the expression: (get $ ((contactContact val) :: UserId))
In the first argument of `map', namely
`(\ (Entity key val) -> (get $ ((contactContact val) :: UserId)))'
以下代码获取一个与联系人具有一对多关系的List实体。在Contact Model中,有一个名为contact的属性表示对User的外键约束(conctact的类型是UserId)。 我正在尝试检索联系人列表(userIds列表)并执行map get来检索用户实体列表。
根据我的理解,在使用带有UserId类型的联系实体的get时,存在类型泛化的问题,但我无法弄清楚它可以使用的正确类型。
getContactsR :: Handler Html
getContactsR = do
muser <- maybeAuth
case muser of
Just (Entity userId user) -> do
(list, contacts) <- runDB $ do
maybeList <- getBy (UniqueList userId)
case maybeList of
Just (Entity listId list) -> do
contacts' <- selectList [ContactList ==. listId] []
let contacts = map (\(Entity key val) -> (get $ ((contactContact val) :: UserId) )) contacts'
return (list, contacts')
Nothing -> error "Could not retrieve contact list"
defaultLayout $(widgetFile "contacts")
Nothing -> do
setMessage $ toHtml ("Error getting contact list" :: Text)
redirect HomeR
提前致谢
答案 0 :(得分:3)
我认为你需要替换:
let contacts = map (\(Entity key val) -> (get $ ((contactContact val) :: UserId) )) contacts'
使用:
contacts <- mapM (\(Entity key val) -> (get $ ((contactContact val) :: UserId) )) contacts'
(是的,这里的持久性错误消息非常糟糕,我们正在研究持久性2.0。)我认为甚至可能不需要UserId
类型注释。