2014-04-05 9 views
8

Dynamic प्रकार के एक चर को देखते हुए, यह सही प्रकार पर कंडीशनिंग के बिना आंतरिक चर के प्रकार वर्गों का लाभ लेना संभव है? उदाहरण के लिए, मान लीजिए कि मैं एक समारोह prettyShow लिखना चाहता हूं। यदि आंतरिक प्रकार Show का उदाहरण है, तो हमें उस उदाहरण का उपयोग करना चाहिए; अन्यथा, हमें Dynamic कक्षा के उदाहरण का उपयोग करना चाहिए।डेटा संयोजन। गतिशील और प्रकार वर्ग

prettyShow :: Dynamic -> String 
prettyShow x = case fromDynamic x :: (forall a. Show a => Maybe a) of 
    Nothing -> show x 
    Just y -> show y 

संपादित करें:: कोड में, ऐसा दिखाई दे सकता है यह इस सीधे, नहीं किया जा सकता कुछ अच्छी युक्ति है कि किया जा सकता है क्या कर रहे हैं प्रकट होता है के बाद से?

+0

संक्षेप में, नहीं। मैं इस जानकारी के लिए उपलब्ध होने के लिए प्यार करता हूं, लेकिन कक्षा की जानकारी खो जाती है और संकलन के बाद केवल एक टाइपरेप रहता है। –

+1

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

+2

... लेकिन ऐसा नहीं है। –

उत्तर

6

लाइब्रेरी में Dynamic के कार्यान्वयन का उपयोग करके यह किया जा सकता है (यदि आप जेनेरिक प्रोग्रामिंग और जीएचसी एक्सटेंशन के बहुत सारे उपयोग करते हैं)।

{-# LANGUAGE TypeOperators #-} 

import Data.TypeRep 

type Types = BoolType :+: IntType :+: ListType 

x, y :: Dynamic Types 
x = toDyn [False,True] 
y = toDyn [1, 2 :: Int] 

test1 = show x 
test2 = show y 

show की परिभाषा सरल है, और आप गतिशील मूल्यों पर अन्य कार्यों को परिभाषित करने के पुस्तकालय का उपयोग कर सकते हैं।

उपरोक्त उदाहरण में मैंने एक बंद प्रकार ब्रह्मांड Type का उपयोग किया। लेकिन डेटा प्रकार ए ला कार्टे ट्रिक्स का उपयोग करके आप खुले सार्वभौमिक कार्यों के लिए कार्यों को भी परिभाषित कर सकते हैं। उदाहरण के लिए, show स्वयं खुला है।

प्रदर्शन

एक simple benchmark से पता चलता है कि इस Dynamic 2-3 बार ऊपर उपयोग छोटे प्रकार ब्रह्मांड के लिए base में Data.Dynamic की तुलना में धीमी है। ब्रह्मांड को 30 प्रकार के रचनाकारों तक बढ़ाने से यह 10 गुना धीमा हो जाता है। नए प्रकार

open-typerep के लिए

ऑटो पाने पूर्वनिर्धारित प्रतिनिधित्व प्रकार की एक छोटी संख्या से ब्रह्मांडों बनाना समर्थित। यह सिद्धांत रूप में नए प्रकार के लिए स्वत: प्राप्त करने के लिए टेम्पलेट हास्केल का उपयोग करना संभव है, लेकिन Witness और PWitness के लिए सही उदाहरण उत्पन्न करना मुश्किल होगा क्योंकि ये अन्य उदाहरणों पर निर्भर करते हैं। (Witness का उपयोग Show उदाहरण Dynamic के लिए किया गया है।)

+0

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

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