【问题标题】:YesodAuthEmail could not deduce m ~ HandlerFor site0 [duplicate]YesodAuthEmail 无法推断出 m ~ HandlerFor site0 [重复]
【发布时间】:2018-11-21 08:07:21
【问题描述】:

我正在尝试添加

instance YesodAuthEmail App 

Yesod-Postgres 脚手架(yesod 1.6 版)并陷入编译错误。

相关代码为:

instance YesodAuth App where
     type AuthId App = UserId
     ....
     authPlugins :: App -> [AuthPlugin App]
     authPlugins app = [authOpenId Claimed []] ++ extraAuthPlugins
         where extraAuthPlugins = [ authEmail ]

instance YesodAuthEmail App where
    type AuthEmailId App = UserId

    afterPasswordRoute _ = HomeR

    addUnverified email verkey =
        runDB $ insert $ User email Nothing 

我收到的错误是:

/home/justin/code/yesodemail/src/Foundation.hs:273:11: error:
• Could not deduce: m ~ HandlerFor site0 from the context: MonadAuthHandler App m bound by the type signature for: addUnverified :: Yesod.Auth.Email.Email -> VerKey -> AuthHandler App (AuthEmailId App) ....
Expected type: m (AuthEmailId App) Actual type: HandlerFor site0 (Key User)

根据类型,

getEmail :: AuthEmailId site -> AuthHandler site (Maybe Email) 
type MonadAuthHandler master m = (MonadHandler m, YesodAuth master, master ~ HandlerSite m, Auth ~ SubHandlerSite m, MonadUnliftIO m)
type AuthHandler master a = forall m. MonadAuthHandler master m => m a

我原以为这会编译。我误会了什么?

附:我已尝试包含所有相关内容,但完整的 Foundation.hs 位于 https://gist.github.com/hyperpape/39d4d2baf67d3bdbdba45a943e7e0425

【问题讨论】:

    标签: haskell authorization yesod type-families


    【解决方案1】:

    runDB的类型是:

    runDB :: YesodDB site a -> HandlerFor site a 
    

    要在AuthHandler 中调用它,您需要将其提升到HandlerFor

    如果我没记错的话,这就是来自MonadHandlerliftHandler 方法的用途。

    如果你用它编写runDB 电话,它应该可以工作:

    addUnverified email verkey =
        liftHandler . runDB $ insert $ User email Nothing
    

    我找到了您问题here的详细答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多