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