13

yesod の本とソースを読んで、すべてがどのように機能するかを学びました。しかし、私が自分自身のものを書く前に、足場のサイトには理解できないことが 1 つあります。

だから私はサイト「copywww」を足場にし、ファイル CopyWWWState.hs にコードがあります:

instance YesodPersist CopyWWWState where
    type YesodDB CopyWWWState = SqlPersist
    runDB db = liftIOHandler
             $ fmap connPool getYesod >>= Settings.runConnectionPool db

instance YesodAuth CopyWWWState where
    type AuthId CopyWWWState = UserId

    -- Where to send a user after successful login
    loginDest _ = RootR
    -- Where to send a user after logout
    logoutDest _ = RootR

    getAuthId creds = runDB $ do
        x <- getBy $ UniqueUser $ credsIdent creds
        case x of
            Just (uid, _) -> return $ Just uid
            Nothing -> do
                fmap Just $ insert $ User (credsIdent creds) Nothing

    authPlugins = [ authOpenId
                  , authEmail
                  ]

私が理解していない行は次のとおりです。

type AuthId CopyWWWState = UserId
type YesodDB CopyWWWState = SqlPersist

それらを削除すると、明らかにエラーが発生しますが、そもそもなぜそれらが必要なのかわかりません。ソースで「UserId」または「SqlPersist」を検索すると、有望と思われるものは何も見つかりません。このコードは正確には何のためにそこにある必要がありますか? これらのクラスで型ファミリを使用することで、yesod はどのような利点を得ますか?

4

2 に答える 2

7

足場では、すぐにはわからないことがかなりあります。構成/モデルには、次のように定義された永続エンティティがあります。

User
  name String
  foo String

これにより、PersistEntity のインスタンスであるタイプ User と、そのように使用されるタイプ UserId が作成されます。

instance PersistEntity User where
  ...
  Key User = UserId

足場が入る理由:

type AuthId CopyWWWState = UserId

ユーザーが論理的な基準点であるというだけです。さて、あなたのコードでは、呼び出すたびに のrequireAuthようなものが得られ、Handler Userと同等requireAuthIdの が得られます。これらを好きなように自由に変更できますが、YesodAuth 型クラス インスタンスの他の関数のいくつかを変更する必要があります。Handler UserIdHandler (Key User)

お役に立てれば。イェソド岩。それがどのようにくっついているかの感触をつかむのに1、2週間かかりますが、このようなことをすると非常に強力です.

于 2011-06-08T11:29:18.137 に答える
2

型ファミリは、機能的な依存関係に似ています。どちらも、型チェッカーを満足させながら、複数のパラメーターで型クラスを抽象化する方法を提供します。ローカルtypeは、インスタンスによってバインドされる追加のパラメーターがあることを意味します。これは、インスタンスがその場所で使用するタイプを自分で決定できることを意味します。インスタンスは、特定のタイプではなく、より一般的なタイプを使用して、ユーザーに選択肢を与えることもできます。あなたの場合、ypur データベース タイプYesodDBが実際には SQL データベースであるという事実に依存している可能性があります ( SqlPersist)。したがって、この情報はタイプチェッカーを満たすために必要です。

于 2011-06-07T19:37:26.243 に答える