2017-09-14 3 views
1

ich einen einfachen Yesod-Handler, die einen einzelner HTML-Tag wie so machen:Strecke Interpolation nicht mit Typ-Fehlern in Yesod Handler

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

Ich mag den Weg drucken, und den Code ändern, um die @{HomeR} zu verwenden Route Interpolation Syntax wie folgt aus:

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

Interpolier Routen in meinem Yesod-Handler nicht mit diesem Fehler:

• 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) 

Antwort

1

Ihre Art Yesod site => HandlerT site IO Html ermöglicht Website jede Yesod Instanz jedoch zu sein, wird die Handler-Funktion nur in der Baustelle arbeiten, um es für erstellt wird.

In diesem Fall heißt Ihre Yesod-Instanz App (ich glaube, das ist der Standard für die Scaffolding-Site). Deshalb ist die richtige Art wäre: HandlerT App IO Html

Vorausgesetzt, Sie das Gerüst Website verwenden (aufgrund Ihrer Antwort Handler zu erwähnen), dann Yesod schafft die Art Synonym HandlerHandlerT App IO zu bedeuten, so müssen Sie nicht halten Sie es heraus eingeben .

Dies ist, warum, wie Sie festgestellt haben, funktioniert Handler Html und Ihre ursprüngliche Version nicht.

1

ändert die Art Signatur getHomeR :: Handler Html