2011-06-07 34 views
13

我瀏覽了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」的源代碼時,我沒有提到任何看起來很有希望的東西。這段代碼到底需要做什麼? yesod在這些類中使用類型族有什麼好處?

回答

7

腳手架上有很多事情可能並不明顯。在配置/模型,有一個持久實體定義是這樣的:

User 
    name String 
    foo String 

這將創建一個類型的用戶是PersistEntity的一個實例,一種類型的用戶ID被用作這樣的:

instance PersistEntity User where 
    ... 
    Key User = UserId 

該支架放入其原因是:

type AuthId CopyWWWState = UserId 

僅僅是用戶是一個邏輯的參考點。現在,在您的代碼中,只要您撥打requireAuth,您就會得到類似於Handler UserrequireAuthId的信息,將會給您一個Handler UserId,相當於Handler (Key User)。你可以自由地將它們改爲任何你想要的,但是你必須改變YesodAuth類型類實例中的其他一些函數。

希望這會有所幫助。 Yesod岩石。需要一兩個星期才能體會到它們如何粘在一起,但是當你做這樣的事情時非常強大。

2

類型系列與函數依賴類似。他們都提供了一種方法來抽象類型類型超過一個以上的參數,同時保持typechecker快樂。當地的type只是意味着你有一個被實例綁定的額外參數。這意味着實例可以自行決定在那個地方使用哪種類型。一個實例也可以使用更通用的類型而不是特定的類型來給用戶選擇。在你的情況下,你可能依靠的事實是,ypur數據庫類型YesodDB實際上是一個SQL數據庫(SqlPersist)。所以這個信息是需要滿足typechecker。