2012-01-17 100 views
2

我試着修改一個Yesod項目,並遇到了一個奇怪的錯誤。首先,我將介紹工作表單代碼,以及帶有錯誤信息的裸機代碼。爲什麼一個使用toWidget的工作,另一個不是

type PForm x = ProductConfig -> Html -> MForm ReScheduler ReScheduler (FormResult x, Widget)

工作代碼下一

productForm :: PForm SelectedProduct 
productForm config extra = do 
    let pInfo' = pInfo config 
     aDays' = aDays config 
     products = (catMaybes . pNametoText) pInfo' 
     versions' = map consVersionPair pInfo' 
    productInfo <- mapM generateSelectFields versions' 
    (dateRes, dateView) <- mreq (selectField aDays') "placeHolder" Nothing 
    (mailRes, mailView) <- mreq emailField "E-Mail Address" Nothing 
    (noteRes, noteView) <- mreq textareaField 
           "Notes" 
           Nothing 
    let productVersion = reduceFormResults $ 
         map flagSelected $ 
         map fst productInfo 

     versionViews = map snd productInfo 
    let widget = 
      toWidget $(widgetFile "firmware") :: Widget 


    return (makeSelected productVersion dateRes mailRes noteRes, widget) 

上面的代碼工作正常。這裏是破碎的代碼,然後是錯誤和一些觀察。

type RForm x = [KeyJobPair] -> Html -> MForm ReScheduler ReScheduler (FormResult x, Widget)

statusForm :: RForm ModData 
statusForm kjPairs extra = do 
-- let bPairs = buttonPairs kjPairs 
--  statusPairs = map (pack . show &&& id) $ 
--      ([minBound .. maxBound] :: [Status]) 
-- (jobRes,jobView) <- mreq (radioField bPairs) "Scheduled Jobs" Nothing 
-- (mailRes, mailView) <- mreq emailField "E-Mail Address" Nothing 
-- (noteRes, noteView) <- mreq textareaField "Notes" Nothing 
-- (statusRes, statusView) <- mreq (selectField statusPairs) "Status" Nothing 
-- let widget = toWidget [hamlet|<p> testing |] 
    let widget = (toWidget $(widgetFile "status")) :: Widget 
    return (ModData <$> undefined <*> undefined <*> undefined, widget) 


Handler/Manager.hs:109:19: 
No instance for (ToWidget 
       ReScheduler ReScheduler (GGWidget master0 m0())) 
    arising from a use of `toWidget' 
Possible fix: 
    add an instance declaration for 
    (ToWidget ReScheduler ReScheduler (GGWidget master0 m0())) 
In the expression: (toWidget ($(widgetFile "status"))) :: Widget 
In an equation for `widget': 
    widget = (toWidget ($(widgetFile "status"))) :: Widget 
In the expression: 
    do { let widget = ...; 
     return 
     (ModData <$> undefined <*> undefined <*> undefined, widget) } 

注意註釋掉硬編碼的小村莊代碼。這編譯好。這使我相信問題在於widgetFile,而不是toWidget。我在Yesod博客中指出,有時widgetFile需要明確的:: Widget類型簽名。我一直無法得到這個工作。也許這只是一個語法問題。反饋將受到歡迎。在此期間,我可以使用硬編碼的哈姆雷特。

回答

2

這是一個語法問題。這是簽名類型正確放置的問題。

let widget = toWidget ($(widgetFile "status") :: Widget)

這是正確的。

相關問題