Route Outpolation失败,Yesod Handler中出现类型错误

时间:2017-09-14 15:06:12

标签: haskell routes yesod hamlet

我有一个简单的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)

2 个答案:

答案 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有效,原始版本没有。