Результирующая переменная неоднозначного типа в вызове Persistent `get`

У меня возникает следующая ошибка при попытке получить список сущностей из списка внешних атрибутов.

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, которая имеет связь «один ко многим» с контактом. В модели контактов есть атрибут, называемый контактом, для представления ограничения внешнего ключа для пользователя (тип контакта — UserId). Я пытаюсь получить список контактов (список идентификаторов пользователей) и выполнить получение карты для получения списка пользовательских объектов.

Насколько я понимаю, существует проблема обобщения типов при использовании get для Contact Entity с типом UserId, но я не могу понять, с каким типом он может работать.

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   

заранее спасибо


person renny    schedule 21.05.2014    source источник


Ответы (1)


Я думаю, вам нужно заменить:

let contacts = map (\(Entity key val) -> (get $ ((contactContact val) :: UserId) )) contacts'

с участием:

contacts <- mapM (\(Entity key val) -> (get $ ((contactContact val) :: UserId) )) contacts'

(Да, постоянные сообщения об ошибках здесь ужасны, мы работаем над этим для Persistent 2.0.) Я думаю, что аннотация типа UserId может даже не понадобиться.

person Michael Snoyman    schedule 21.05.2014