1

これは私の質問のフォローアップです: Extracting database field values inside a Handler

データベースから情報を抽出し、フォームのラベル値として渡したいと思います。ただし、型エラーが発生します。

以下の簡単なデモ (Yesod Book のシェル コード):

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE QuasiQuotes           #-}
{-# LANGUAGE TemplateHaskell       #-}
{-# LANGUAGE TypeFamilies          #-}
import           Control.Applicative ((<$>), (<*>))
import           Data.Text           (Text)
import           Data.Time           (Day)
import           Yesod
import           Yesod.Form.Jquery

data App = App

mkYesod "App" [parseRoutes|
/ HomeR GET
|]

instance Yesod App

instance RenderMessage App FormMessage where
    renderMessage _ _ = defaultFormMessage

instance YesodJquery App

data Person = Person
    { personName          :: Text
    }
  deriving Show

personForm :: Text -> Html -> MForm Handler (FormResult Person, Widget)
personForm n1 = renderDivs $ Person
    <$> areq textField n1 Nothing  -- Changing n1 to "Name" works just fine. 


getHomeR :: Handler Html
getHomeR = do
    (widget, enctype) <- generateFormPost $ personForm "test"
    defaultLayout
        [whamlet|
            <p>
                The widget generated contains only the contents
                of the form, not the form tag itself. So...
        |]


main :: IO ()
main = warp 3000 App

runhaskell でプログラムを実行すると、次のエラーが発生します。

Couldn't match expected type `FieldSettings site0'
            with actual type `Text'
In the second argument of `areq', namely `n1'
In the second argument of `(<$>)', namely
  `areq textField n1 Nothing'
In the second argument of `($)', namely
  `Person <$> areq textField n1 Nothing'

私も試してみ (FieldSettings n1 Nothing Nothing Nothing []) ましたが、うまくいきませんでした。ラベル値をareqに渡す方法について何か考えはありますか?

4

1 に答える 1