YesodAuthEmail 无法推断出 m ~ 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: 错误:<br>
• 无法从上下文中推断出:m ~ HandlerFor site0:MonadAuthHandler App m
受类型签名约束:
addUnverified :: Yesod.Auth.Email.Email -> VerKey -> AuthHandler App (AuthEmailId App)
....<br>
预期类型:m(AuthEmailId App)
实际类型:HandlerFor site0(关键用户)
根据类型,
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
runDB
的类型是:
runDB :: YesodDB site a -> HandlerFor site a
为了在 AuthHandler
中调用它,您需要将其提升到 HandlerFor
。
如果我没记错的话,这就是 MonadHandler
中的 liftHandler
方法的用途。
如果你用它编写 runDB
调用,它应该可以工作:
addUnverified email verkey =
liftHandler . runDB $ insert $ User email Nothing
我找到了您问题的详细答案 here。
我正在尝试添加
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: 错误:<br>
• 无法从上下文中推断出:m ~ HandlerFor site0:MonadAuthHandler App m
受类型签名约束:
addUnverified :: Yesod.Auth.Email.Email -> VerKey -> AuthHandler App (AuthEmailId App)
....<br>
预期类型:m(AuthEmailId App)
实际类型:HandlerFor site0(关键用户)
根据类型,
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
runDB
的类型是:
runDB :: YesodDB site a -> HandlerFor site a
为了在 AuthHandler
中调用它,您需要将其提升到 HandlerFor
。
如果我没记错的话,这就是 MonadHandler
中的 liftHandler
方法的用途。
如果你用它编写 runDB
调用,它应该可以工作:
addUnverified email verkey =
liftHandler . runDB $ insert $ User email Nothing
我找到了您问题的详细答案 here。