2012-09-01 86 views
2

我是Yesod Haskell新手,我非常喜歡它,但我必須在一個月後離開它,因爲我無法解決此問題: 我有版本yesod-core版本: 1.0.1.3 我跟着這個例子: More Client Side Yesod: todo sample 我可以創建自己的網頁,並通過JSON 與數據填充它後,我添加使用JSON 一個新的記錄,但我不能刪除或更改記錄,因爲我無法找到一種方法來恢復密鑰。 我不能使用這個系統導出數據如下解釋:如果我用這個系統Yesod修改和刪除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() 

我總是Parsing a JSON postCorrect way to do a 「join」 in persist with yesodaeson-0.6.0.2: Fast JSON parsing and encoding因爲我總是得到這個錯誤得到這個錯誤:

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無法知道postAeldatidelR函數中的id的類型。 parseJsonBody_表示它必須是FromJSON的實例。 delete表示它必須是PersistEntity的實例。但是可能有數百個可以匹配的實例。

在這樣的時代,最簡單的解決方案是提供一個明確的類型簽名。也許這將工作:

haskell runDB (delete (id :: ElarticoliId))