2017-09-14 65 views
1

我有呈現一個HTML標籤,像這樣一個簡單的耶索德處理程序:路線插值失敗,並在耶索德處理程序類型錯誤

getHomeR :: Yesod site => HandlerT site IO Html 
getHomeR = defaultLayout 
    [whamlet|$newline never 
<h1>Hello! 
|] 

我想打印的路線,並改變使用@{HomeR}代碼路線插值語法,就像這樣:

getHomeR :: Yesod site => HandlerT site IO Html 
getHomeR = defaultLayout 
    [whamlet|$newline never 
<h1>@{HomeR} 
|] 

插值在我耶索德處理器路線失敗,此錯誤:

• Couldn't match type ‘site’ with ‘App’ 
    ‘site’ is a rigid type variable bound by 
    the type signature for: 
     getHomeR :: forall site. Yesod site => HandlerT site IO Html 
    at Handler/Home.hs:12:13 
    Expected type: WidgetT 
        site IO (Route App -> [(Text, Text)] -> Text) 
    Actual type: WidgetT 
        site 
        IO 
        (Route (HandlerSite (WidgetT site IO)) -> [(Text, Text)] -> Text) 

回答

1

Yesod site => HandlerT site IO Html類型允許的網站是任何耶索德實例然而,處理函數將只在它被用於創建的網站工作。

在這種情況下,您的Yesod實例被稱爲App(我相信這是腳手架網站的默認設置)。因此,正確的類型是: HandlerT App IO Html

假設你正在使用的腳手架網站(由於你的答案提Handler)然後耶索德創建類型同義詞Handler意味着HandlerT App IO,這樣你就不必繼續鍵入它。

這就是爲什麼,因爲你發現,Handler Html作品和你的原始版本沒有。

1

更改類型簽名getHomeR :: Handler Html