0

解決できないエラーが発生します。スナップアプリケーションは問題なくコンパイルされ、すべて問題ないようです。しかし、ブラウザで関連するページをレンダリングすると、次のエラーが発生します。

Webハンドラーが例外をスローしました。詳細:[_ id:50b56f19208c2e9a09dccc2b、id:1.0、code: "hdg435"、name: "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>

コードの他の部分を投稿する必要があることを教えてください。

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)
  [...]

これは完全に理にかなっています。あなたの場合、本当に文字列が必要なときはデフォルトで整数になっているようです。署名を追加するか、それ以上の方法を試すことができます。

dtp tag d = (tag, at tag d)

これを他のタイプでも機能させたい場合は、もっと一生懸命働かなければなりません。

アップデート

これは、問題と、GHCiがデフォルトでShowインスタンスを整数に設定する方法を説明するGHCiセッションです。

Prelude Data.Bson> show $ at "hello" ["hello" =: "world"]
"*** Exception: expected ("hello" :: Integer) in [ hello: "world"]
于 2012-11-30T00:37:47.637 に答える