1

尝试编译我的 Yesod 项目(从脚手架构建)时出现以下错误。

No instance for (PersistBackend (GGHandler Scheduler Scheduler) IO)
  arising from a use of `checkDateStatus'
Possible fix:
  add an instance declaration for
  (PersistBackend (GGHandler Scheduler Scheduler) IO)
In the first argument of `checkM', namely `checkDateStatus'
In the expression: checkM checkDateStatus
In the expression:
    checkM checkDateStatus
  $ (jqueryDayField
       (def {jdsChangeYear = True, jdsYearRange = "2011:2012"}))

我相信这是因为 Haskell 的类型推断失败了。如果是这种情况,我需要做的就是给 checkDateStatus 一个准确的定义。如果不是朝着正确的方向推动,那将是受欢迎的。如果我是对的,我仍然不知道 checkDateStatus 的类型定义应该是什么。我一直依赖于类型推断。下面是我认为相关的代码。如果我遗漏了什么,请告知。

getManagerR :: Handler RepHtml
getManagerR = do
    ((res, widget), enctype) <- runFormGet productForm
    let findTestId = 1
        res' = prepST res
        scheduledTest = makeScheduledTest res'
    dataInsert <- runDB $ insert scheduledTest
    defaultLayout [whamlet|
<p>Result:#{show res}
   <form enctype=#{enctype}>
      ^{widget}
|]



productForm :: Html
            -> Form Scheduler Scheduler (FormResult SelectedProduct, Widget)
productForm extra = do
   pInfo <- liftIO getUIdata
   let products = V.toList $ V.map productACC  $ fst pInfo
       versions = V.toList $ V.map versionsACC $ snd pInfo
   (productRes, productView) <- mreq (radioField products) "Placeholder" Nothing
   versionInfo <- mapM generateVersionSelectFields versions
   (dateRes, dateView) <- mreq requestedDayField "Schedule" Nothing

--     (dateRes, dateView) <- mreq (jqueryDayField def
--                           { jdsChangeYear = True
--                           , jdsYearRange = "2011:2012"
--                           }) "Schedule" Nothing

   let versionRes = map fst versionInfo
       versionViews = map snd versionInfo
       widget = do
          toWidget [whamlet|
  #{extra}
 <p>
    ^{fvInput productView}
     $forall versionView <- versionViews
        ^{fvInput versionView}
    ^{fvInput dateView}
    <input type=submit value="Request Test">
 |]

   return (makeSelected productRes versionRes dateRes, widget)


requestedDayField = checkM checkDateStatus $ (jqueryDayField def
                                                     { jdsChangeYear = True
                                                     , jdsYearRange = "2011:2012"
                                                     })

errorMessage :: Text 
errorMessage = "I can't go for that, no can do."

checkDateStatus date = do
   maybeTaken <- getBy $ UniqueStartDate date
   case maybeTaken of
      Nothing -> return $ Left errorMessage
      otherwise -> return $ Right date
4

1 回答 1

4

您在 getBy 前面缺少一个 runDB。

于 2011-10-31T02:01:08.223 回答