2012-11-28 103 views
0

我收到一個我無法解決的錯誤。 快照應用程序編譯沒有問題,一切似乎都沒問題。 但是,當我在瀏覽器中呈現相關頁面時,出現此錯誤:Haskell Snap:mongodb字段類型錯誤

Web處理程序引發異常。詳細信息: 預期( 「代碼」 ::整數)[_id:50b56f19208c2e9a09dccc2b,ID:1.0,代號: 「hdg435」,名稱: 「小青蛙」]

的碼值僅僅是我挑一個用於測試的rendom串。我不確定爲什麼會有整數?

這些是示例快照應用程序的相關部分。

getData :: IO [Document] 
getData = do 
    pipe <- runIOE $ connect $ host "127.0.0.1" 
    let run act = access pipe master "test" act 
    result <- run (find (select [] "pcs") >>= rest) 
    close pipe 
    return $ either (const []) id result 

mkSplice :: Document -> Splice AppHandler 
mkSplice d = runChildrenWithText [dtp "id" d 
           ,dtp "code" d 
           ,dtp "name" d 
           ] 


dtp :: Text -> Document -> (Text,Text) 
dtp tag d = (tag, T.pack $ show $ at tag d) 

recSplice :: Splice AppHandler 
recSplice = mapSplices mkSplice =<< liftIO getData 

table :: Handler App App() 
table = heistLocal (bindSplice "rec" recSplice) $ render "table" 

table.tpl的有關斯特模板的一部分是在這裏:

<table> 
    <tbody> 
    <rec> 
     <tr><td><id/></td><td><code/></td><td><name/></td></tr> 
    </rec> 
    </tbody> 
</table> 

請讓我知道代碼的其他部分需要發佈的東西。

+0

我這裏看不到任何會迫使該場整數。問題必須在其他地方。也許實際上正在執行的代碼不符合你的期望?也許你可以嘗試將代碼字段改爲int並查看會發生什麼。另外,我的記憶是,mongo大多是無模式的,但是在mongo中是否會有任何需要整數的東西? – mightybyte

+0

@mightybyte,謝謝。我以爲我在做一些愚蠢的事情。這真的很奇怪,我不明白爲什麼。我改變了記錄,所以它只包含沒有任何數字的字符串:[_id:50b6e74852a4923015a9f225,id:「a」,代碼:「hfgarqe」,名稱:「froggy」]然而,它抱怨期望的整數。我現在正在研究我的頭髮。處理上面的記錄我得到這個錯誤:一個Web處理程序拋出一個異常。詳細信息:[_id:50b6e74852a4923015a9f225,id:「a」,代碼:「hfgarqe」,名稱:「froggy」]中的expected(「id」:: Integer)也許我應該明確地將mongo值轉換爲haskell值... –

回答

1

當我編譯你的排版功能,我得到:

import Data.Bson 
import Data.Text (Text) 
import qualified Data.Text as T 

dtp :: Text -> Document -> (Text,Text) 
dtp tag d = (tag, T.pack $ show $ at tag d) 

Ambiguous type variable `a0' in the constraints: 
    (Show a0) 
    [...] 

這是非常合情合理的。看起來就像在你的情況下,當你真的需要String的時候它默認爲Integer。您可以嘗試添加簽名或更好,只是:

dtp tag d = (tag, at tag d) 

如果您希望此功能適用於其他類型,則必須加倍努力。

UPDATE

下面是說明了這個問題,並GHCI如何似乎默認顯示實例整數GHCI會話:

Prelude Data.Bson> show $ at "hello" ["hello" =: "world"] 
"*** Exception: expected ("hello" :: Integer) in [ hello: "world"] 
+0

謝謝你非常。我其實也只是想通了,忘了更新我的問題。我刪除了節目,一切都很順利。我不明白它爲什麼默認爲整數。但是你是對的,我必須更努力地轉換所有其他可能的數據類型。這只是mongo的初步測試... –