YesodAuth实例问题求助:迁移至yesod-1.6.0后类型推导错误
解决Yesod 1.6.x迁移中authenticate方法的类型不匹配问题
这个错误是因为Yesod Auth 1.6.x对YesodAuth类型类的authenticate方法做了关键调整——它现在运行在AuthHandler monad中,而不是旧版本里的HandlerFor monad。你的代码里直接调用runDB,但runDB默认返回的是HandlerFor App a类型的值,和AuthHandler不匹配,所以编译器无法推导出正确的monad类型。
修复起来很简单,只需要用liftHandler把runDB的操作提升到AuthHandler monad里就行,修改后的代码如下:
instance YesodAuth App where type AuthId App = UserId -- 其他保留的方法... authenticate creds = liftHandler $ runDB $ do x <- getBy $ UniqueUser $ credsIdent creds case x of Just (Entity uid _) -> return $ Authenticated uid Nothing -> return $ UserError InvalidUsernamePass
liftHandler是Yesod Auth提供的工具函数,作用是把底层HandlerFor monad中的计算,提升到上层的AuthHandler monad中,这样就能让编译器正确推导类型,解决你遇到的错误。
另外要确认你的App已经正确实现了YesodPersist类型类,确保runDB能正常工作——不过这个应该在旧版本里已经配置好了,所以主要问题就是添加liftHandler这一步。
内容的提问来源于stack exchange,提问作者jeiea
相关产品推荐
相关产品推荐

