YesodAuthEmail无法推断出〜HandlerFor site0 [英] YesodAuthEmail could not deduce m ~ 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屋!