2012-06-11 13 views
21

हर कोई Show जानता है। लेकिन इसके बारे में:क्या डेटा के लिए शो टाइपक्लास के बराबर है। टेक्स्ट?

class ShowText a where 
    showText :: a -> Text 

मुझे यह कहीं भी नहीं मिल रहा है। क्यूं कर? ।

showText :: Show a => a -> Text 
showText = pack . show 
+0

http://hackage.haskell.org/packages/archive/bytestring-show/0.3.5.1/doc/html/Text-Show-ByteString.html – applicative

उत्तर

11

लाइब्रेरी text-show अब मौजूद है और वास्तव में यह समस्या हल करती है।

अद्यतन (2016 12 फ़र,)

basic-prelude पुस्तकालय में उपलब्ध कराई गई show समारोह भी सीधे पाठ करने के लिए प्रस्तुत करता है:

show :: Show a => a -> Text 

basic-prelude भी text-show से कम निर्भरता है। आप basic-prelude उपयोग करना चाहते हैं, अपने आप को संकलन सिर दर्द को बचाने के अपने स्रोत फ़ाइल के शीर्ष करने के लिए निम्न जोड़कर:

{-# LANGUAGE NoImplicitPrelude #-} 
+0

दोनों बुनियादी-प्रलोभन और उत्तम दर्जे का प्रस्ताव है [tshow] (https://www.stackage.org/lts-8.23/hoogle?q=tshow) – mb21

2

यह अपने खुद के समारोह Show बंद पिगीबैकिंग लिखने के लिए तुच्छ है बिल्डर योजना के साथ बेहतर प्रदर्शन करें और Data.Text.Lazy का उपयोग करें। डैन डोल इसे बाइटस्टिंग-शो में करता है, लेकिन मुझे टेक्स्ट के समकक्ष के बारे में पता नहीं है।

+11

क्या इसका प्रदर्शन हिट है? यानी, क्या मैं 'टेक्स्ट' को सीधे बनाने के बजाए इसे 'टेक्स्ट' में परिवर्तित नहीं कर रहा हूं, फिर इसे 'टेक्स्ट' में परिवर्तित कर रहा हूं? – jameshfisher

+2

क्या आप डेटा का उपयोग करने के सभी लाभ खोले नहीं हैं। इस तरह से आगे? आप मुख्य रूप से 'स्ट्रिंग' के पूर्ववर्ती मुद्दों के कारण टेक्स्ट का उपयोग करते हैं - और इस तरह आप सभी लाभों को बंद कर देते हैं ... – Sventimir

+0

यह देखते हुए कि' शो 'टाइपक्लास मूल रूप से केवल' show :: a -> स्ट्रिंग 'की आवश्यकता होती है, कोई रास्ता नहीं है स्ट्रिंग के माध्यम से बिना 'शोटेक्स्ट' को लागू करने के लिए। बुनियादी और उत्तम दर्जे का प्रस्तावों में 'tshow' कार्यों को भी इस तरह कार्यान्वित किया जाता है। – mb21

14

पाठ सीधे बनाने यदि आप अब भी यह भरने से पहले सख्त पाठ ब्लॉक का कुल आकार पता करने की जरूरत है के साथ समस्या यह आप कर सकते हैं:

+0

पढ़ने/शो कार्यों का बोलना ...किसी दिए गए डेटाटाइप के लिए ("फ़ंक्शन फ़ंक्शन जो असफल हो सकता है", "फ़ंक्शन दिखाएं") की एक जोड़ी कंट्रोल.लेन्स से प्रिज्म में बदल दी जा सकती है? – danidiaz

+0

हाँ! आपको 'रीड' चलाने की क्षमता चाहिए और पता लगाएं कि यह मेल खाता है या नहीं, जिसे हाल ही में आधार पर जोड़ा गया था। –

5

Int मूल्यों के विशेष मामले के लिए, यहाँ उन्हें एक मध्यवर्ती चरण में Strings का उपयोग किए बिना सख्त Text मूल्यों में परिवर्तित करने के कोड है:

import Data.Text 
import Data.Text.Lazy (toStrict) 
import Data.Text.Lazy.Builder (toLazyText) 
import Data.Text.Lazy.Builder.Int (decimal) 

showIntegral :: Integral a => a -> T.Text 
showIntegral = toStrict. toLazyText . decimal 

मॉड्यूल Data.Text.Lazy.Builder.RealFloat चल बिन्दु मूल्यों के लिए इसी तरह की सुविधा प्रदान करता है।

import Data.Text 
import Data.Text.Lazy (toStrict) 
import Data.Text.Lazy.Builder (toLazyText) 
import Data.Text.Lazy.Builder.Int (decimal) 
import Data.Text.Lazy.Builder.RealFloat (realFloat) 

class ShowText a where 
    showText :: a -> Text 

instance ShowText Int where 
    showText = toStrict . toLazyText . decimal 

instance ShowText Float where 
    showText = toStrict . toLazyText . realFloat 

फिर हम अधिक उदाहरणों को जोड़कर शुरू कर सकते हैं (tuples के लिए एक उदाहरण के लिए उपयोगी होगा):

इन के साथ हम Show typeclass के हमारे अपने संस्करण परिभाषित कर सकते हैं।

1

basic-prelude और classy-prelude दोनों में अब एक tshow समारोह है।

tshow :: Show a => a -> Text 

आप मानक प्रस्तावना उपयोग कर रहे हैं, text-show library प्रयास करें।

+0

यह सही है, बिंदु पर, जवाब! – sandwood