maybeAuthId类型错误

时间:2013-07-14 07:00:16

标签: haskell yesod

我有一个脚手架网站,我在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有关,但我不知道如何解决这个问题。任何帮助赞赏。

谢谢!

1 个答案:

答案 0 :(得分:2)

maybeAuthId住在Handler monad,而defaultLayout的内部是Widget,这就是你不匹配的原因。您可以执行以下操作之一:

  • 使用handlerToWidget
  • Handler操作转换为Widget操作
  • maybeAuthId来电移至defaultLayout
  • 之前