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))

Другие вопросы по тегам