持久性“get”调用中产生的模糊类型变量

时间:2014-05-21 00:48:40

标签: haskell monads yesod persistent

尝试从外部属性列表中检索实体列表时出现以下错误。

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   

提前致谢

1 个答案:

答案 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类型注释。