मैं प्रतीक का उपयोग कर प्रकार स्तर पर टैग की गई वस्तुओं को स्टोर करने के लिए एक डेटा संरचना बनाना चाहता हूं। यह:Idiomatic बूलियन समानता उपयोग (सिंगलेट्स)
data Store e (ss :: [Symbol]) where
Nil :: Store e '[]
Cons :: e s -> Store e ss -> Store e (s ': ss)
data HasElem (a :: k) (as :: [k]) where
AtHead :: HasElem a (a ': as)
InTail :: HasElem a as -> HasElem a (b ': as)
class HasElemC (a :: k) (as :: [k]) where hasElem :: HasElem a as
instance HasElemC {OVERLAPPING} a (a ': as) where hasElem = AtHead
instance HasElemC a as => HasElemC a (b ': as) where hasElem = InTail hasElem
from :: HasElemC s ss => Store e ss -> e s
from = from' hasElem
from' :: HasElem s ss -> Store e ss -> e s
-- from' _ Nil = undefined
from' h (Cons element store) = case h of
AtHead -> element
InTail h' -> from' h' store
थोड़े से काम करता है, अगर आप इस तथ्य है कि संकलक मुझे आपूर्ति नहीं from' _ Nil
परिभाषा के लिए चेतावनी दी है की उपेक्षा (? क्यों ऐसा होता है, वैसे वहाँ यह करने से रोकने के लिए एक रास्ता है?) लेकिन क्या मैं वास्तव में चाहता था शुरुआत में करने के लिए अपने स्वयं के प्रकार-स्तर कोड लिखने के बजाय, मूर्खतापूर्ण फैशन में सिंगलेट्स लाइब्रेरी का उपयोग करना था। कुछ ऐसा:
import Data.Singletons.Prelude.List
data Store e (ss :: [Symbol]) where
Nil :: Store e '[]
Cons :: Sing s -> e s -> Store e ss -> Store e (s ': ss)
from :: Elem s ss ~ True => Store e ss -> e s
from (Cons evidence element nested) = ???
दुख की बात है कि मैं संदर्भ को समान रूप से संदर्भित करने के तरीके को समझ नहीं पाया। मैं सिंगलटन लाइब्रेरी से बिल्डिंग ब्लॉक का उपयोग कैसे कर सकता हूं जो मैं करने की कोशिश कर रहा हूं?
[email protected], [email protected]
आप 'स्टोर' स्टोर को जोड़कर 'से' में चेतावनी को हटा सकते हैं 'स्टोर ई (एस': एसएस) -> एसएस 'और' स्टोरटेल :: स्टोर ई (एस ': एसएस) -> स्टोर ई एसएस 'और' एथहेड 'या' इनटेल 'से मेल खाने के बाद स्टोर पर उनका उपयोग करें। – cchalmers
आपके दो 'HasElemC' उदाहरण ओवरलैप हैं।जीएचसी को 'हैसलेम' की बाधा को निर्वहन करना असंभव लगेगा क्योंकि यह सबूत खोज करते समय पूर्व शर्त की जांच नहीं करता है। सौभाग्य से [प्रकार परिवारों और 'UndecidableInstances'] का उपयोग कर एक प्रसिद्ध चाल है (https://wiki.haskell.org/GHC/AdvancedOverlap)। (वास्तव में यह बूलियन प्रकार के परिवारों के कुछ अच्छे उपयोगों में से एक है।) –
धन्यवाद cchalmers, जो काम किया। धन्यवाद, बेंजामिन। मेरे मामले में ओवरलैप ठीक हैं: मुझे एसएस में फ़िलिमॉर्फिक फ़ंक्शन की आवश्यकता नहीं है। हालांकि मुझे भविष्य में उनकी आवश्यकता हो सकती है। – NioBium