我在 Yesod、Auth-HashDB 和 PostgreSQL 上的网络应用程序拒绝编译——无法将类型“AuthEntity App”与“User”匹配

My web app on Yesod, Auth-HashDB, and PostgreSQL refuses to compile -- Couldn't match type ‘AuthEntity App’ with ‘User’

我一直在努力给自己上 Yesod 的速成班,但我似乎无法弄清楚我在这里做错了什么。这可能是概念上的失败,但我或多或少地复制粘贴了 HashDB 的各种简短介绍中可用的代码,试图制作散列数据库身份验证系统,但没有成功。

Foundation.hs:136:23:
    Couldn't match type ‘AuthEntity App’ with ‘User’
    In the expression: getAuthIdHashDB AuthR (Just . UniqueUser) creds
    In an equation for ‘getAuthId’:
        getAuthId creds = getAuthIdHashDB AuthR (Just . UniqueUser) creds
    In the instance declaration for ‘YesodAuth App’

来自每个相关的代码段:

config/models:

User
name Text
password Text Maybe
UniqueUser name

Model.hs:

import Yesod.Auth.HashDB (HashDBUser, userPasswordHash, setPasswordHash)

import Database.Persist.Quasi (lowerCaseSettings)

...

share [mkPersist sqlSettings, mkMigrate "migrateAll"]
    $(persistFileWith lowerCaseSettings "config/models")

instance HashDBUser User where
    userPasswordHash = userPassword
    setPasswordHash h u = u { userPassword = Just h }

Foundations.hs:

...

import Yesod.Auth
import Yesod.Auth.HashDB    (authHashDBWithForm, getAuthIdHashDB, authHashDB)
import Yesod.Auth.Message   (AuthMessage (InvalidLogin))

...

instance YesodAuth App where
    type AuthId App = UserId

    loginDest _ = HomeR
    logoutDest _ = HomeR
    redirectToReferer _ = True


    authPlugins _ = [ authHashDB (Just . UniqueUser) ]

    getAuthId creds = getAuthIdHashDB AuthR (Just . UniqueUser) creds

    authHttpManager = getHttpManager

如有任何帮助,我们将不胜感激。我对 Haskell 还是有些厌恶,所以这也是我对它的速成课程的尝试。

这通常意味着您没有 AuthEntity associated type declared, which in turn means that you don't have a YesodAuthPersist 实例。在您的情况下,这可能只是:

instance YesodAuthPersist App where
    type AuthEntity App = User

这是由 Yesod 脚手架提供的。