我不熟悉Yesod,在嵌套两个hamlet文件时我遇到了一些问题,其中一个有一个表单。
loginForm :: Form Admin
loginForm = renderDivs $ Admin
<$> areq textField (bfs ("Login" :: Text)) Nothing
<*> areq passwordField (bfs ("Password" :: Text)) Nothing
Form Admin
代表type Form a = Html -> MForm Handler (FormResult a, Widget)
,只是一个语法糖,以避免重复。
我使用辅助函数来调用hamlet文件,该文件是一个页脚并具有表单,考虑到它会出现在所有页面中。
footer widgetLogin enctypeLogin = toWidget $(hamletFile "hamlet/footer.hamlet")
我将footer.hamlet
文件缩小为敏感数据。
<form role="form" method="post" enctype=#{enctypeLogin} action=@{AdminRedirectR}>
^{widgetLogin}
<button type="submit" class="btn btn-default">Go
然后,一些调用页脚功能的页面:
getIndexR :: Handler Html
getIndexR = do
generateFormPost loginForm >>= \(widgetLogin, enctypeLogin) ->
defaultLayout $(whamletFile "hamlet/index.hamlet")
在index.hamlet
内,我有^{footer}
,但这样做会突然出现错误:
Couldn't match expected type Page with actual type ‘HandlerSite m0’
The type variable m0 is ambiguous …
类型Page
是类型类Yesod
的一个实例。
如果我用页脚代码本身替换^{footer}
,错误消失了,但它有点笨拙而且不实用。
我该如何解决?