2011-10-30 109 views
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

您錯過了getBy前面的runDB。