1

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

2 回答 2

1

将类型签名更改为getHomeR :: Handler Html

于 2017-09-14T15:06:39.527 回答
1

您的类型Yesod site => HandlerT site IO Html允许站点是任何 Yesod 实例,但是,处理程序函数仅在为其创建的站点中工作。

在这种情况下,您的 Yesod 实例称为 App(我相信这是脚手架站点的默认设置)。因此正确的类型是: HandlerT App IO Html

假设您正在使用脚手架站点(由于您的回答提到Handler),那么 Yesod 创建类型同义词Handler来表示HandlerT App IO,因此您不必继续输入它。

这就是为什么,正如您所发现的,Handler Html有效而您的原始版本无效。

于 2017-09-15T19:04:23.973 回答