我有一个简单的Yesod处理程序,可以呈现单个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}
|]
我的Yesod处理程序中的插值路径失败,出现此错误:
• 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)
答案 0 :(得分:1)
将类型签名更改为i
答案 1 :(得分:1)
您的类型Yesod site => HandlerT site IO Html
允许站点为任何Yesod实例,但处理程序功能仅在其创建的站点中有效。
在这种情况下,您的Yesod实例称为App(我相信这是脚手架网站的默认设置)。因此,正确的类型是:
HandlerT App IO Html
假设您正在使用脚手架网站(由于您的回答提及Handler
),Yesod会将类型同义词Handler
创建为HandlerT App IO
,因此您不会必须继续打字。
这就是为什么,正如您所发现的,Handler Html
有效,原始版本没有。