2011-06-07 24 views
13

के लिए है, मैं हांद पुस्तक और स्रोत के माध्यम से गया और सबकुछ सीखा कि सब कुछ कैसे काम करता है। लेकिन इससे पहले कि मैं अपनी खुद की चीजें लिखूं, मचान वाली साइट में एक चीज है जिसे मैं समझ नहीं पा रहा हूं।मुझे समझ में नहीं आता है कि इस प्रकार की पारिवारिक सामग्री हूद में

तो मैं एक साइट "copywww" और फ़ाइल CopyWWWState.hs में मचान वहाँ कोड है:

type AuthId CopyWWWState = UserId 
type YesodDB CopyWWWState = SqlPersist 

:

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 
        ] 

लाइनों है कि मुझे समझ नहीं आता होते हैं जब मैं उन्हें हटा देता हूं, तो मुझे स्पष्ट रूप से त्रुटियां मिलती हैं, लेकिन मुझे यकीन नहीं है कि उन्हें पहले स्थान की आवश्यकता क्यों है। जब मैं "UserId" या "SqlPersist" के स्रोत को खोजता हूं तो मैं ऐसा कुछ भी नहीं करता जो वादा करता है। इस कोड को वास्तव में क्या होना चाहिए? इन वर्गों में टाइप परिवारों का उपयोग करने से हाँद को क्या फायदा होता है?

उत्तर

7

मचान में काफी कुछ चल रहा है जो तुरंत स्पष्ट नहीं हो सकता है।

instance PersistEntity User where 
    ... 
    Key User = UserId 
:

User 
    name String 
    foo String 

यह जो PersistEntity का एक उदाहरण है और एक प्रकार UserId जो इस तरह के रूप में प्रयोग किया जाता है एक प्रकार उपयोगकर्ता पैदा करेगा: config/मॉडल में, वहाँ एक लगातार इकाई की तरह कुछ परिभाषित किया गया है

कारण यह है कि पाड़ में डालता है:

type AuthId CopyWWWState = UserId 

सिर्फ इतना है कि उपयोगकर्ता एक तार्किक संदर्भ बिंदु है। अब, आपके कोड में, जब भी आप requireAuth पर कॉल करेंगे तो आपको Handler User और requireAuthId जैसे कुछ मिलेंगे, आपको Handler UserId देगा जो Handler (Key User) के समतुल्य है। आप उन्हें अपनी पसंद के किसी भी चीज़ में बदलने के लिए स्वतंत्र हैं, लेकिन आपको YesodAuth टाइपक्लास उदाहरण में कुछ अन्य कार्यों को बदलना होगा।

उम्मीद है कि इससे मदद मिलती है। यसोड चट्टानों। यह महसूस करने के लिए एक या दो सप्ताह लगते हैं कि यह कैसे चिपक जाता है लेकिन जब आप इस तरह की चीजें करते हैं तो वे काफी शक्तिशाली होते हैं।

2

टाइप परिवार कार्यात्मक निर्भरताओं के समान हैं। टाइपशेकर को खुश रखते हुए वे दोनों एक से अधिक पैरामीटर पर टाइप टाइप को अमूर्त करने का एक तरीका प्रदान करते हैं। स्थानीय type का मतलब है कि आपके पास एक अतिरिक्त पैरामीटर है जो उदाहरण से बंधे हैं। इसका मतलब यह है कि उदाहरण स्वयं ही तय कर सकता है कि उस स्थान पर किस प्रकार का उपयोग करना है। एक उदाहरण उपयोगकर्ता को पसंद करने के लिए एक विशिष्ट के बजाय एक सामान्य प्रकार का भी उपयोग कर सकता है। आपके मामले में, आप संभवतः इस तथ्य पर भरोसा करते हैं कि ypur डेटाबेस प्रकार YesodDB वास्तव में एक SQL डेटाबेस (SqlPersist) है। तो टाइपशेकर को संतुष्ट करने के लिए इस जानकारी की आवश्यकता है।

संबंधित मुद्दे