Haskell Snap:mongodb字段类型错误

时间:2012-11-28 11:03:38

标签: mongodb haskell haskell-snap-framework

我收到一个我无法解决的错误。 快照应用程序编译没有问题,一切似乎都没问题。 但是,当我在浏览器中呈现相关页面时,我收到此错误:

Web处理程序引发了异常。细节: 在[_id:50b56f19208c2e9a09dccc2b,id:1.0,代码:“hdg435”,名称:“froggy”]

中预期(“code”:: Integer)

代码值只是我选择用于测试的重新连接字符串。我不确定为什么会出现整数?

这些是示例快照应用程序的相关部分。

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的相关Heist模板部分在这里:

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

请告诉我代码的其他部分需要发布。

1 个答案:

答案 0 :(得分:1)

当我编译你的dtp函数时,我得到:

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)

如果您希望这适用于其他类型,则必须加倍努力。

<强>更新

这是一个GHCi会话,它说明了问题以及GHCi如何将Show实例默认为Integer:

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