0

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

Web 处理程序引发了异常。详细信息:[_id:50b56f19208c2e9a09dccc2b,id:1.0,代码:“hdg435”,名称:“froggy”]中的预期(“代码”::整数)

代码值只是我为测试选择的一个随机字符串。我不确定为什么需要一个整数?

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

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>

请让我知道代码的其他部分需要发布。

4

1 回答 1

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"]
于 2012-11-30T00:37:47.637 回答