我有一个脚手架网站,我在Home Handler中使用了这段代码。
{-# LANGUAGE TupleSections, OverloadedStrings #-}
module Handler.Home where
import Import
import Yesod.Auth
getHomeR :: Handler RepHtml
getHomeR = do
defaultLayout $ do
maid <- maybeAuthId
setTitle "Welcome!"
$(widgetFile "homepage")
我想访问homepage.hamlet文件中的 maid
。但是,我收到以下错误:
Handler/Home.hs:10:17:
Couldn't match expected type `WidgetT site0 IO t0'
with actual type `HandlerT master0 IO (Maybe (AuthId master0))'
In a stmt of a 'do' block: maid <- maybeAuthId
In the second argument of `($)', namely
`do { maid <- maybeAuthId;
setTitle "Welcome!";
$(widgetFile "homepage") }'
In a stmt of a 'do' block:
defaultLayout
$ do { maid <- maybeAuthId;
setTitle "Welcome!";
$(widgetFile "homepage") }
无论是否在homepage.hamlet中放入任何内容,我都会收到上述错误消息。如果我从Yesod Book(Auth部分)粘贴whamlet代码片段,它可以正常工作,而不是使用 $(widgetFile "homepage")
。
如果我删除对maybeAuthId的调用,问题就会消失。我猜这与调用maybeAuthId和使用widgetFile有关,但我不知道如何解决这个问题。任何帮助赞赏。
谢谢!
答案 0 :(得分:2)
maybeAuthId
住在Handler
monad,而defaultLayout
的内部是Widget
,这就是你不匹配的原因。您可以执行以下操作之一:
Handler
操作转换为Widget
操作
maybeAuthId
来电移至defaultLayout