अब हमारे पास इंजेक्शन प्रकार परिवार हैं, क्या परिवार परिवारों के प्रकार के परिवारों का उपयोग करने के लिए कोई शेष उपयोग केस है?डेटा परिवार बनाम इंजेक्शन प्रकार परिवार
डेटा परिवारों के बारे में पिछले StackOverflow सवाल को देखते हुए, वहाँ एक जोड़े साल पहले प्रकार परिवारों और डेटा परिवारों के बीच अंतर पर चर्चा से this question, और this answer डेटा परिवारों के उपयोग के मामलों के बारे में है। दोनों कहते हैं कि डेटा परिवारों की इंजेक्शनिटी उनकी सबसे बड़ी ताकत है।
docs on data families पर देखकर, मुझे injective type families का उपयोग कर डेटा परिवारों के सभी उपयोगों को फिर से लिखने का कारण नहीं दिखता है।
उदाहरण के लिए, मैं एक डेटा परिवार है का कहना है कि (मैं डॉक्स से कुछ उदाहरण विलय कर दिया गया है डेटा परिवारों की सभी सुविधाओं में निचोड़ करने की कोशिश करने के लिए)
data family G a b
data instance G Int Bool = G11 Int | G12 Bool deriving (Eq)
newtype instance G() a = G21 a
data instance G [a] b where
G31 :: c -> G [Int] b
G32 :: G [a] Bool
मैं भी
के रूप में यह फिर से लिखने सकता हैtype family G a b = g | g -> a b
type instance G Int Bool = G_Int_Bool
type instance G() a = G_Unit_a a
type instance G [a] b = G_lal_b a b
data G_Int_Bool = G11 Int | G12 Bool deriving (Eq)
newtype G_Unit_a a = G21 a
data G_lal_b a b where
G31 :: c -> G_lal_b [Int] b
G32 :: G_lal_b [a] Bool
यह कहने के बिना चला जाता है कि डेटा परिवारों के लिए संबंधित उदाहरण इसी प्रकार के परिवारों के साथ संबंधित उदाहरणों से मेल खाते हैं। फिर एकमात्र शेष अंतर है कि हमारे पास टाइप-नेमस्पेस में कम चीजें हैं?
एक फॉलोअप के रूप में, क्या टाइप-नेमस्पेस में कम चीजें रखने का कोई फायदा है? मैं सोच सकता हूं कि यह ghci
पर किसी के साथ खेलने वाले किसी के लिए नरक डीबगिंग हो जाएगा - रचनाकारों के प्रकार सभी संकेत देते हैं कि रचनाकार सभी एक जीएडीटी के तहत हैं ...
मैंने सोचा कि [यह] (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#constraints-in-kinds) डेटा परिवारों के साथ किया जा सकता है और प्रकार नहीं परिवार, लेकिन यह डेटा परिवारों के साथ भी काम नहीं करता है - आप ऐसे डेटा परिवार की घोषणा कर सकते हैं लेकिन किसी भी उदाहरण की घोषणा करने का प्रयास करने से त्रुटि होती है। – user2407038
@ user2407038 मुझे यकीन नहीं है कि मैं समझता हूं - उदाहरण स्पष्ट रूप से प्रकार के परिवारों के साथ काम करता है (जैसा कि आपने जो लिंक दिया है), और मैं इसे डेटा परिवारों के साथ काम करने के लिए भी प्राप्त कर सकता हूं, लेकिन मुझे लाभ नहीं दिखाई देता है। ('डेटा परिवार टी :: ए -> *; डेटा उदाहरण टी 42 = एमकेएनएट; डेटा इंस्टेंस टी" घबराओ मत! "= एमकेसिंबोल') – Alec
वे अलग-अलग प्रकार हैं; उपयोगकर्ता मार्गदर्शिका में उदाहरण * प्रकार * कन्स्ट्रक्टर (मूल्य कन्स्ट्रक्टर नहीं) में समानता बाधा ('IsTypeLit a ~ True') के बारे में है। आपको किसी प्रकार के परिवार के प्रकार पर कोई बाधा नहीं हो सकती है, और आप 'डेटा परिवार टी :: फॉरल ए घोषित कर सकते हैं। (IsTypeLit a ~ 'True) => a -> * 'लेकिन' टी' के किसी भी उदाहरण कभी नहीं। – user2407038