YesodAuthEmail无法推断出〜HandlerFor site0 [英] YesodAuthEmail could not deduce m ~ HandlerFor site0

查看:173
本文介绍了YesodAuthEmail无法推断出〜HandlerFor site0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试添加

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

我本以为会编译.我的误会是什么?

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

解决方案

MonadHandler中的rel ="noreferrer"> liftHandler 方法适用.

如果用它编写runDB调用,它应该可以工作:

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

我在此处找到了您问题的详细答案.. >

I'm trying to add

instance YesodAuthEmail App 

to the Yesod-Postgres scaffolding (yesod version 1.6) and getting stuck on a compile error.

The relevant code is:

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 

The error I receive is:

/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)

Based on the types,

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

I would have thought this would compile. What I am misunderstanding?

P.S. I've tried to include everything relevant, but the full Foundation.hs is at https://gist.github.com/hyperpape/39d4d2baf67d3bdbdba45a943e7e0425

解决方案

The type of runDB is:

runDB :: YesodDB site a -> HandlerFor site a 

in order to call it in AuthHandler you need to lift it to HandlerFor.

If I am not mistaken this is what the liftHandler method from MonadHandler is for.

If you compose your runDB call with it, it should work:

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

I found a detailed answer to your question here.

这篇关于YesodAuthEmail无法推断出〜HandlerFor site0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆