3

我正在关注有关如何使用单子形式的yesod 书籍示例。我的 getRootR 操作几乎是从书中逐字记录的。我得到了一个编译器错误,去掉了准引用,但仍然得到了错误。下面是我的错误消息,代码原样,然后是我希望 getRootR 的样子。任何关于问题可能是什么的输入将不胜感激。

ghci Rocko.hs

...几个“包加载”消息传递直到...

Rocko.hs:67:5:

Couldn't match type `handler'
               with `GGHandler
                       Scheduler
                       Scheduler
                       (Data.Enumerator.Iteratee Data.ByteString.Internal.ByteString IO)'
  `handler' is a rigid type variable bound by
            the type signature for getRootR :: handler RepHtml at Rocko.hs:65:1
Expected type: handler RepHtml
  Actual type: GGHandler
                 Scheduler
                 Scheduler
                 (Data.Enumerator.Iteratee Data.ByteString.Internal.ByteString IO)
                 RepHtml
Expected type: handler RepHtml
  Actual type: GHandler Scheduler Scheduler RepHtml
In the return type of a call of `defaultLayout'
In the expression:
  defaultLayout
    (addHtml
       ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
          "<p>Result: </p>"))

失败,加载模块:JsonParser。

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

 data Scheduler = Scheduler

 mkYesod "Scheduler" [parseRoutes|
 / RootR GET
 |]

 instance Yesod Scheduler where
    approot _ = ""

 instance RenderMessage Scheduler FormMessage where
    renderMessage _ _ = defaultFormMessage

 instance YesodJquery Scheduler

 data SelectedProduct = MKsp { product :: Text
                             , version :: Text
                             , requestedDate :: Day
                             } deriving Show


 productForm :: Html
             -> Form Scheduler Scheduler (FormResult SelectedProduct, Widget)
 productForm extra = do
    pInfo <- liftIO getUIdata
    let products = Prelude.map productACC $ fst pInfo
        versions = Prelude.map versionsACC $ snd pInfo
        version' = head versions
    (productRes, productView) <- mreq (radioField products) "Placeholder" Nothing
    (versionRes, versionView) <- mreq (selectField version') "Placeholder" Nothing
    (dateRes, dateView) <- mreq (jqueryDayField def
                          { jdsChangeYear = True
                          , jdsYearRange = "2011:2012"
                          }) "Schedule" Nothing
    let selectedRes = MKsp <$> productRes <*> versionRes <*> dateRes
        widget = do
           toWidget [whamlet|
  #{extra}
  <p>
     ^{fvInput productView}
     ^{fvInput versionView}
     ^{fvInput dateView}
     <input type=submit value="aint that some &^*^">
  |]

    return (selectedRes, widget)

 productACC :: ProductNames -> (Text,Text)
 productACC (MKpn pNames) = (pNames,pNames)

 versionsACC :: [ProductVersions] -> [(Text,Text)]
 versionsACC pVersions = Prelude.map vACC' pVersions
                                where vACC' (MKpv pversions') = (pversions', pversions')

 getRootR :: handler RepHtml
 getRootR = do
     ((res, widget), enctype) <- runFormGet productForm
     defaultLayout [whamlet|
 <p>Result:
 |]

 main = return ()
 -- main :: IO ()
 --main = warpDebug 3000 Scheduler `

这就是我希望 getRootR 现在看起来的样子

>getRootR :: Handler RepHtml
 getRootR = do
   ((res, widget), enctype) <- runFormGet productForm
   defaultLayout [whamlet|
  <p>Result: #{show res}
  <form enctype=#{enctype}>
      ^{widget}
  |]
4

1 回答 1

5

我想这是因为你有

getRootR :: handler RepHtml

Handler应该是大写的 h。

于 2011-10-21T08:15:03.923 回答