我收到一个我无法解决的错误。 快照应用程序编译没有问题,一切似乎都没问题。 但是,当我在浏览器中呈现相关页面时,我收到此错误:
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>
请告诉我代码的其他部分需要发布。
答案 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"]