我在Yesod(0.10)中建立了一个调查站点,并且迷失了类型。
这是我正在尝试做的简化版本。

invitation url = do
   render <- getUrlRender
   return $ renderHtml [hamlet|
<p>Dear foo, please take our
   <a href=@{ShowSurveyR url}>survey.
|] render

另一个函数将调用此函数,以期希望可以从Network.Mail.Mime中将某些内容传递给simpleMail。上面的函数给出类型错误:
Handler/Root.hs:404:13:
    The function `renderHtml' is applied to two arguments,
    but its type `Html -> LT.Text' has only one

这很令人困惑,因为模板教程似乎以这种方式进行操作。
但是如果我修改代码,就像这样...
invitation url = do
   return $ renderHtml [hamlet|
<p>Dear foo, please take our
   <a href=@{ShowSurveyR url}>survey.
|]

我收到此类型错误。
Handler/Root.hs:403:24:
    The lambda expression `\ _render[a4TO] -> ...' has one argument,
    but its type `Html' has none
    In the first argument of `renderHtml', namely

我认为renderHtml是使用错误的函数,但是我找不到正确的函数。有人知道我在想什么吗?我应该如何将路由功能传递给我的哈姆雷特代码?

最佳答案

准引用([hamlet|...|])返回一个函数,其参数也是一个函数。您必须首先应用该准报价值,然后将结果传递给renderHtml:

[编辑:正如@MattoxBeckman发现的,另一个问题是需要使用getUrlRenderParams而不是gutUrlRender。]

invitation url = do
  render <- getUrlRenderParams
  return $ renderHtml $ [hamlet|
<p>Dear foo, please take our
<a href=@{ShowSurveyR url}>survey.
|] render

(请注意其他$)。

附言renderHtml的类型为Html -> Text,而准引用的结果[hamlet|..|]的类型为Render url -> Html。您看到的第一条错误消息指出您试图将两个参数传递给renderHtml,而第二条错误消息指出您没有将任何参数传递给准报价值。

07-24 09:52