需要一些关于函数类型定义的指导

时间:2011-10-30 23:29:56

标签: haskell types yesod

尝试编译我的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

1 个答案:

答案 0 :(得分:4)

你在getBy前面缺少一个runDB。

相关问题