Я пытаюсь написать функцию-обработчик для приложения 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.
Аннотировать все, все типы типов не работает, и теперь я ослеп, уставившись на ошибки.
Длинное объяснение простого вопроса: Может кто-нибудь сказать мне, что здесь происходит?