Yesod изменить и удалить с помощью JSON
Я новичок в Yesod Haskell, мне это очень нравится, но я должен оставить его через месяц, потому что не могу решить эту проблему: у меня есть версия yesod-core:1.0.1.3 Я последовал этому примеру: More Client Side Yesod: todo sample Я могу создать свою собственную страницу и заполнить ее данными через json. После добавления новой записи с помощью json Но я не могу удалить или изменить запись, потому что не могу найти способ вернуть ключ. Я не могу использовать эту систему для получения данных, как описано здесь: парсинг сообщения JSON и правильный способ сделать "соединение" в постоянном режиме с помощью yesod и aeson-0.6.0.2: быстрый анализ и кодирование JSON, потому что я всегда получаю эту ошибку:
Exception when trying to run compile-time code:
Data.Aeson.TH.withType: Unsupported type: TySynD Model.Elarticoli [] (AppT (ConT Model.ElarticoliGeneric) (ConT Database.MongoDB.Query.Action))
Code: deriveFromJSON (id) ''Elarticoli
Если я использую эту систему:
Elarticoli
marca Text
descrizione Text
idum Int
prezzo Double
instance FromJSON (Key id Elarticoli) where
parseJSON = fmap Key . parseJSON
instance FromJSON Elarticoli where
parseJSON (Object v) = Elarticoli
<$> v .: "marca"
<*> v .: "descrizione"
<*> v .: "idum"
<*> v .: "prezzo"
parseJSON _ = fail "Invalid Elarticoli"
postAeldatidelR :: Handler ()
postAeldatidelR = do
id <- parseJsonBody_
runDB (delete id)
sendResponseStatus status204 ()
Я всегда получаю эту ошибку:
Handler/Aeldati.hs:72:12:
Ambiguous type variable `val0' in the constraint:
(PersistEntity val0) arising from a use of `delete'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `runDB', namely `(delete id)'
In a stmt of a 'do' block: runDB (delete id)
In the expression:
do { id <- parseJsonBody_;
runDB (delete id);
sendResponseStatus status204 () }
Для настойчивости я использую MongoDB. Мне придется вернуться к работе на Java? Спасибо за любую помощь.
1 ответ
Проблема в том, что у GHC нет возможности узнать тип id
в вашем postAeldatidelR
функция. parseJsonBody_
говорит, что это должно быть примером FromJSON
, delete
говорит, что это должно быть примером PersistEntity
, Но есть потенциально сотни случаев, которые могут соответствовать этому.
В такие моменты самое простое решение - предоставить явную сигнатуру типа. Возможно, это будет работать:
haskell
runDB (delete (id :: ElarticoliId))