मॉड्यूल GHC.TypeLits वर्तमान में natVal
और symbolVal
प्रदान करता है, जो हमें Nat
या Symbol
प्रकार से रनटाइम मान प्राप्त करने की अनुमति देता है। [String]
प्रकार के रनटाइम मान को '[Symbol]
के प्रकार से बाहर करने का कोई तरीका है? मुझे ऐसा करने का एक स्पष्ट तरीका नहीं दिख रहा है। मैं उस व्यक्ति के बारे में सोच सकता हूं जो OverlappingInstances
के साथ टाइपक्लास का उपयोग करता है, लेकिन ऐसा लगता है कि जीएचसी के पास पहले से ही एक फ़ंक्शन होना चाहिए।टाइप स्तर सूची को एक मान
उत्तर
symbolVal
टाइप स्तर सूचियों पर मैप किया जा सकता है। ऐसा करने के लिए हमें DataKinds
और TypeOperators
के अतिरिक्त ScopedTypeVariables
और PolyKinds
की आवश्यकता होगी।
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PolyKinds #-}
import Data.Proxy
import GHC.TypeLits
हम (किसी भी तरह के) जिसके लिए हम "प्रकार [String]
के क्रम मूल्य प्राप्त" कर सकते हैं प्रकार के वर्ग में परिभाषित किया जाएगा।
class SymbolVals a where
symbolVals :: proxy a -> [String]
हम किसी भी खाली सूची के लिए तारों की एक सूची प्राप्त कर सकते हैं।
instance SymbolVals '[] where
symbolVals _ = []
हम प्रकार जहाँ हम पहले प्रकार और शेष के लिए स्ट्रिंग की एक सूची के लिए एक स्ट्रिंग प्राप्त कर सकते हैं की किसी भी सूची के लिए स्ट्रिंग की एक सूची प्राप्त कर सकते हैं।
instance (KnownSymbol h, SymbolVals t) => SymbolVals (h ': t) where
symbolVals _ = symbolVal (Proxy :: Proxy h) : symbolVals (Proxy :: Proxy t)
आह, बहुत अच्छा। मैं भूल गया कि यह एक परिदृश्य नहीं होगा जिसके लिए 'ओवरलैपिंग इंस्टेंस' की आवश्यकता है क्योंकि '' [] 'और' (h ': t)' प्रकार ओवरलैप नहीं होते हैं। धन्यवाद। –
मैं singletons
लाइब्रेरी का उपयोग करने का सुझाव देता हूं। -> HList XS -> [स्ट्रिंग] `या` forall (
$ stack ghci --package singletons
Configuring GHCi with the following packages:
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> :set -XDataKinds
Prelude> import Data.Singletons.Prelude
Prelude Data.Singletons.Prelude> fromSing (sing :: Sing '["a","b"])
["a","b"]
Prelude Data.Singletons.Prelude> :t fromSing (sing :: Sing '["a","b"])
fromSing (sing :: Sing '["a","b"]) :: [String]
- 1. टाइप स्तर
- 2. टाइप स्तर
- 3. टाइप स्तर पूर्वानुमान आधारित उदाहरण टाइप करें?
- 4. उस सूची में एक मान को सूची सौंपना
- 5. सूची से आइटम को हटाने से सूची को गैर-टाइप
- 6. एलिस्प सूची में एक मान
- 7. स्प्रिंग सिक्योरिटीज @ प्राइवॉर्डेनाइजेशन टाइप स्तर पर विधि स्तर
- 8. कास्ट वैकल्पिक मान टाइप करें
- 9. कुंजी मान जोड़े की एक सूची को हैशटेबल
- 10. पायथन - सेट सूची एक विशिष्ट मान
- 11. क्रमबद्ध स्ट्रिंग सूची मान
- 12. सूची विधि टाइप सुरक्षित नहीं होता है
- 13. एक एप्लिकेशन आर्किटेक्ट स्तर
- 14. एक स्तर
- 15. Google डिस्क - परिवर्तन: सूची एपीआई - फ़ोल्डर स्तर
- 16. मैं एक विशिष्ट स्तर
- 17. वीबी.Net सूची। ढूँढें। मान पास
- 18. एक सूची क्रमबद्ध करें ताकि एक विशिष्ट मान शीर्ष
- 19. सूची में मौजूद एक टुपल में एक मान तक पहुंच
- 20. हास्केल की टाइप सिस्टम और तर्क प्रोग्रामिंग - स्तर
- 21. मजबूत टाइप किए गए रेडियोबटन सूची
- 22. टाइप करके सूची कैसे ऑर्डर करें?
- 23. एक आइटम सूची को एक पूर्णांक
- 24. किसी अन्य कॉलम में कारक स्तर के आधार पर एक कॉलम में संख्यात्मक मान बदलें
- 25. एक नियंत्रक स्तर
- 26. एक पदानुक्रम स्तर
- 27. एक पदानुक्रम स्तर
- 28. एक निश्चित शीर्षक स्तर
- 29. गतिशील सूची <T> टाइप
- 30. मिस्चैच टाइप करें: ArrayList से सूची
आप 'तरह forall (XS :: [प्रतीक]) कुछ में रुचि रखते हैं: आप सभी कि आप की आवश्यकता लेकिन
Sing
Proxy
प्रकार के बजाय का उपयोग कर एक्सएस :: [प्रतीक]) -> प्रॉक्सी एक्सएस -> [स्ट्रिंग] '। पूर्व सरल है, उत्तरार्द्ध थोड़ा कम सरल है (आपको एक्सएस पर एक प्रकार की कक्षा की बाधा की आवश्यकता होगी)। – user2407038मैं बाद वाले की तलाश में हूं। हालांकि मैं यह देखने के लिए चिंतित हूं कि पूर्व कैसे किया जाता है (लेकिन ऐसा लगता है कि 'एचएलआईस्ट (एक्सएस ::' [प्रतीक]) 'सूचियों की सूची की तरह है)। इसके अलावा, मैंने कभी भी 'फोरल' को इस तरह इस्तेमाल नहीं किया है। क्या यह मात्रा की मात्रा के बाद एक अवधि नहीं होने चाहिए? –