0

MichaelSnoymanhttp ://vimeo.com/39646807によるこのスクリーンキャストをフォローしようとしました。ただし、i18nを変更すると、そのコードが失敗するようです。足場のあるサイトでこの問題を解決する方法についての情報を見つけることができず、ここで提供されている情報を完全に理解することはできませんhttp://www.yesodweb.com/book/internationalization

これは、Home.hsのコードを参照して取得したエラーです。

No instance for (RenderMessage master0 FormMessage)
  arising from a use of `generateFormPost'
Possible fix:
  add an instance declaration for (RenderMessage master0 FormMessage)
In a stmt of a 'do' block:
  (formWidget, enctype) <- generateFormPost noteForm
In the expression:
  do { (formWidget, enctype) <- generateFormPost noteForm;
       defaultLayout ($(widgetFile "notes")) }
In an equation for `getNotesR':
    getNotesR
      = do { (formWidget, enctype) <- generateFormPost noteForm;
             defaultLayout ($(widgetFile "notes")) }

情報はかなり明確に見えますが、問題は(RenderMessage master0 FormMessage)のインスタンス宣言を追加する方法がわからないことです。

これが私がHome.hsに追加したコードです

noteForm = renderBootstrap $ Note
    <$> areq textField "Title" Nothing
    <*> areq textField "Content" Nothing

getNotesR = do
    (formWidget, enctype) <- generateFormPost noteForm
    defaultLayout $(widgetFile "notes")

postNotesR = return ()
getNoteR noteId = return ()

Ant以下はtemplates/notes.hamletからのものです

<form method=post enctype=#{enctype}>
    ^{formWidget}
    <input type=submit>
4

2 に答える 2

2

一般的な命題として、次のようなものが表示された場合:

No instance for (RenderMessage master0 FormMessage)

master0(または小文字で始まるようなもの)は、具体的な型にインスタンス化されていない自由型変数であることに注意してください。aそれが助けになるなら、あなたはそれを精神的に置き換えることができます。これで、2番目のパラメーターで一意に決定される汎用 RenderMessageインスタンスがなく、最初のパラメーターで任意のタイプが存在することがメッセージに示されていることがわかります。FormMessage

したがって、これを修正する通常の方法は、フリータイプをインスタンス化する対象を特定し、そのインスタンス化に修正するための型アノテーションまたはその他のヒントを提供することです。

この場合、MichaelSnoymanによって提案された型署名がnoteForm :: Form Noteこの目的を果たします。

于 2013-05-15T16:02:40.253 に答える
0

このコードを追加するのはどうですか?

instance RenderMessage [The name of your Yesod instance] FormMessage where
    renderMessage _ _ = defaultFormMessage

http://www.yesodweb.com/book/internationalizationを参照してください。

于 2013-03-24T13:52:25.087 に答える