Не удалось сопоставить тип «PersistEntityBackend a0» с «MongoContext» - получить документ по ObjectId - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь написать функцию-обработчик для приложения Yesod, которая примет ObjectId как String, запросит коллекцию MongoDB и вернет документ, соответствующий этому ObjectId.

В документации есть функция с именем get, которая, кажется, делает именно это, но эта функция ожидает Key. Снова обращаясь к документации , я нахожу функцию oidToKey, которая преобразует ObjectId в Key. Собирая все это вместе, моя первая попытка заключается в следующем:

getMyEventR :: String -> Handler Value
getMyEventR oid = do
  let key = oidToKey (read oid :: ObjectId)
  Just myEvent <- runDB $ get key
  returnJson myEvent

но это не так с

error:
• Couldn't match type ‘PersistEntityBackend a0’ with ‘MongoContext’
    arising from a use of ‘get’
  The type variable ‘a0’ is ambiguous
• In the second argument of ‘($)’, namely ‘get key’
  In a stmt of a 'do' block: Just myEvent <- runDB $ get key
  In the expression:
    do let key = oidToKey (read oid :: ObjectId)
       Just myEvent <- runDB $ get key
       returnJson myEvent

Это привело меня к этому вопросу, в котором ОП отмечает, что ваши типы Entity на самом деле имеют экземпляр Key; для меня

newtype instance Key MyEvent = MyEventKey {unMyEventKey :: BackendKey MongoContext}

Отлично!

let key = oidToKey (read oid :: ObjectId)
Just myEvent <- runDB $ get $ MyEventKey key
returnJson myEvent

Нету:

    • Couldn't match expected type ‘BackendKey MongoContext’
              with actual type ‘Key record0’

А, ладно, мне нужно BackendKey, а не Key. Давайте попробуем использовать toBackendKey:

let key = toBackendKey (oidToKey (read oid :: ObjectId))
Just myEvent <- runDB $ get $ MyEventKey key
returnJson myEvent

Опять нет:

    • Ambiguous type variable ‘record0’ arising from a use of ‘toBackendKey’
  prevents the constraint ‘(ToBackendKey
                              MongoContext record0)’ from being solved.
  Probable fix: use a type annotation to specify what ‘record0’ should be.

Аннотировать все, все типы типов не работает, и теперь я ослеп, уставившись на ошибки.

Длинное объяснение простого вопроса: Может кто-нибудь сказать мне, что здесь происходит?

...