2017-09-14 5 views
1

J'ai simple gestionnaire Yessod qui rend une seule balise Html comme ceci:Route Interpolation échoue avec l'erreur de type dans Yessod Gestionnaire

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

Je voudrais imprimer l'itinéraire et modifier le code pour utiliser le @{HomeR} syntaxe d'interpolation d'itinéraire, comme ceci:

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

routes d'interpolation dans mon gestionnaire Yesod échoue avec cette erreur:

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

Répondre

1

Votre type Yesod site => HandlerT site IO Html permet site d'être une instance Yessod cependant, la fonction de gestionnaire ne fonctionnera que dans le site, il est créé.

Dans ce cas, votre instance Yesod s'appelle App (je crois que c'est la valeur par défaut pour le site d'échafaudage). Par conséquent, le type correct serait: HandlerT App IO Html

présumant que vous utilisez le site d'échafaudage (en raison de votre réponse mentionnant Handler) puis Yessod crée le type synonyme Handler signifie HandlerT App IO de sorte que vous ne devez pas continuer à taper sur .

C'est pourquoi, comme vous l'avez découvert, Handler Html fonctionne et votre version originale ne fonctionne pas.

1

Modifier la signature de type à getHomeR :: Handler Html