Подтвердить что ты не робот

Я не понимаю, что такое семейный материал в Yesod для

Я прошел через книгу Yesod и источник и многому научился, как все работает. Но прежде чем я напишу свой собственный материал, на строительном сайте есть одна вещь, которую я просто не понимаю.

Итак, я нахожу сайт "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", я придумываю ничего, что кажется многообещающим. Для чего именно этот код нужен? Какая польза от использования типов типов в этих классах?

4b9b3361

Ответ 1

В эшафоте довольно много происходит, что может быть не сразу очевидным. В конфигурации/модели существует постоянная сущность, определенная как:

User
  name String
  foo String

Это создаст тип User, который является экземпляром PersistEntity и типом UserId, который используется как таковой:

instance PersistEntity User where
  ...
  Key User = UserId

Причина, по которой находится эшафот:

type AuthId CopyWWWState = UserId

только, что пользователь является логической точкой отсчета. Теперь, в вашем коде, когда вы вызываете requireAuth, вы получите что-то вроде Handler User и requireAuthId даст вам Handler UserId, который эквивалентен Handler (Key User). Вы можете изменить их на все, что захотите, но вам придется изменить некоторые другие функции в экземпляре typod класса YesodAuth.

Надеюсь, это поможет. Йесодские породы. занимает неделю или две, чтобы почувствовать, как он слипается, но когда вы делаете такие вещи, достаточно мощные.

Ответ 2

Типы семейств аналогичны функциональным зависимостям. Оба они обеспечивают способ абстрагировать класс типов более чем одним параметром, сохраняя при этом стилизатор. Локальный type означает, что у вас есть дополнительный параметр, связанный экземпляром. Это означает, что экземпляр может сам решить, какой тип использовать в этом месте. Экземпляр также может использовать более общий тип, а не конкретный, чтобы дать пользователю выбор. В вашем случае вы, возможно, полагаетесь на тот факт, что тип базы данных ypur YesodDB на самом деле является базой данных SQL (SqlPersist). Таким образом, эта информация необходима для соответствия методу typechecker.