2012-06-09 9 views
17

मुझे डिबगिंग के लिए प्रिंट करने से पहले Data.Text उदाहरणों को अनपॅक करने का बीमार पड़ गया और इसके लिए केवल Text.Printf का उपयोग करने के लिए सोचा।टेक्स्ट.प्रिंटफ डेटा के साथ। टेक्स्ट?

{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE ScopedTypeVariables #-} 
import Data.Text 
import Text.Printf 

--instance PrintfArg Text where 
-- toUPrintf = toUPrintf . unpack 

main :: IO() 
main = do 
    let input :: Text = "abc" 
    printf "Input: %s\n" input 

त्रुटि:

src/Main.hs:12:3: 
    No instance for (PrintfArg Text) 
     arising from a use of `printf' 
    Possible fix: add an instance declaration for (PrintfArg Text) 
    In a stmt of a 'do' block: printf "Input: %s" input 
    In the expression: 
     do { let input :: Text = "abc"; 
      printf "Input: %s" input } 
    In an equation for `main': 
     main 
      = do { let input :: Text = ...; 
       printf "Input: %s" input } 

उदाहरण घोषणा uncommenting के बाद: दुर्भाग्य से, मैं यह काम नहीं कर सके

src/Main.hs:7:7: 
    `toUPrintf' is not a (visible) method of class `PrintfArg' 
src/Main.hs:7:19: Not in scope: `toUPrintf' 

कोई भी विचार?

संपादित

के रूप में सुझाव दिया, की कोशिश की वें, अभी भी कोई जाने:

{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE ScopedTypeVariables #-} 
{-# LANGUAGE TemplateHaskell #-} 
import Data.Text 
import Language.Haskell.TH 
import Text.Printf 

runQ [d| instance PrintfArg Text where toUPrintf = toUPrintf . unpack|] 

main :: IO() 
main = do 
    let input :: Text = "abc" 
    printf "Input: %s\n" input 

त्रुटि:

src/Main.hs:9:40: 
    'toUPrintf' is not a (visible) method of class 'PrintfArg' 
src/Main.hs:9:52: Not in scope: 'toUPrintf' 

मदद! यह आश्चर्यजनक है कि डिफ़ॉल्ट रूप से Data.Text का उपयोग करने के लिए सभी सलाह दिए गए बॉक्स से बाहर काम नहीं करता है।

+0

printf पैकेज प्राप्त करें और PrintfArg वर्ग और उपयोग निर्यात कि सामान्य पैकेज के बजाय। – augustss

+1

@augustss: printf आधार में है, एक अलग पैकेज नहीं है। और शायद पर्याप्त सामान निर्यात किया जा सकता है ताकि उपयोगकर्ता अपना खुद का प्रिंटफैर उदाहरण बना सकें? –

+1

मैं सभी प्रकार के वर्गों और प्रकारों को बेनकाब करने के लिए एक टेक्स्ट.प्रिंटफ। आंतरिक मॉड्यूल जोड़ूंगा। – augustss

उत्तर

11

चेतावनी : टेक्स्ट-फॉर्मेट अनियमित है, लेखक से 2 साल में कोई प्रतिक्रिया नहीं है। अन्य उत्तरों देखें।


मैं text-format पैकेज को देखो चाहते हैं: यह Text.Printf के समान है, लेकिन विशेष रूप से Data.Text.Lazy के लिए बनाया गया है।

वहाँ Text.Printf से अधिक पाठ प्रारूप के कुछ अन्य लाभ हैं:

  • Buildable वर्ग, सामने आ रहा है तो यह नया पैरामीटर प्रकारों का समर्थन करने के लिए बढ़ाया जा सकता है।
  • यह varargs के लिए एक सरल दृष्टिकोण का उपयोग करता है, जो Text.Printf में accessing the return value के साथ समस्याओं को दूर करता है।
  • यह बहुत तेजी से होना चाहिए, कई कारणों से:
    • यह कभी नहीं अक्षम String प्रतिनिधित्व करने के लिए धर्मान्तरित;
    • यह में UPrintf के विपरीत इंटरमीडिएट डेटाटाइप का निर्माण नहीं करता है;
    • यह पैकेज Double और Float को प्रस्तुत करने के लिए उपयोग करता है, जो प्रीलूड के तरीकों की तुलना में 30 times faster है।
+0

धन्यवाद, मैं 'TF.print" इनपुट समाप्त कर चुका हूं: {} \ n "$ TF.Only input'। –

+9

आप शास्त्रीय printf-स्वरूपण सामग्री जैसे '% .02f' के साथ कैसे करते हैं? –

+0

क्या डेटा.Text.Format.Format इस IsString उदाहरण को पढ़ता है पर दस्तावेज़ है? क्या मैं इसके साथ मानक 'printf' प्रारूप वर्णों का उपयोग कर सकता हूं? –

1
प्रलेखन से

:

The HPrintfType class provides the variable argument magic for hPrintf. Its implementation is intentionally not visible from this module.

आप वें का उपयोग HPrintfType उदाहरणों उत्पन्न करने के लिए (क्योंकि वें निर्यात प्रतिबंध पर ध्यान नहीं देता) सबसे आसान समाधान शायद एक printf' प्रकार समारोह है सकता है:

printt :: PrintType r => Text -> r 
printt = printf . Data.Text.unpack 
+0

काम नहीं करता है या तो: src/Main.hs: 12: 3: (PrintfArg पाठ) 'printt' संभव फिक्स की एक उपयोग से उत्पन्न होने के लिए कोई उदाहरण: (PrintfArg पाठ) के लिए एक उदाहरण घोषणा जोड़ने 'डू' ब्लॉक के एक स्टैम में: प्रिंट "इनपुट:% s" इनपुट अभिव्यक्ति में: {इनपुट :: टेक्स्ट = "एबीसी" करें; प्रिंट "इनपुट:% s" इनपुट} 'मुख्य' के लिए समीकरण में: मुख्य = करें {इनपुट :: टेक्स्ट = ...; प्रिंट "इनपुट:% s" इनपुट} –

+0

ओह, मेरे बारे में मूर्खतापूर्ण। आप स्वरूप स्ट्रिंग से अधिक स्पष्ट रूप से उपयोगी होना चाहते हैं। खैर मुझे लगता है कि आपको प्रिंटर मॉड्यूल में उदाहरण जोड़ने या TH का उपयोग करने की आवश्यकता होगी। –

1

बाहर की जाँच के लायक एक और पैकेज: formatting

Combinator-based type-safe formatting (like printf() or FORMAT) for Text.

Example:

format ("Person's name is " % text % ", age is " % hex) "Dave" 54 
+0

ऐसा लगता है कि इसमें सी-लाइब्रेरी निर्भरता है? कुछ डबल-रूपांतरण ... –

+0

यह अब डबल-रूपांतरण या टेक्स्ट-प्रारूप पर निर्भर नहीं करता है। –

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