2012-06-09 11 views
17

Hata ayıklama için yazdırmadan önce her zaman Data.Text örneklerini açmasından bıktım ve bunun için sadece Text.Printf'u kullanmayı düşündüm.Text.Printf with Data.Text?

{-# 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 

hatası:

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 } 

örneği beyanı uncommenting sonra: Ne yazık ki, o iş yapamadı

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

Herhangi bir fikir?

önerildiği gibi

EDITED, hala hiçbir gitmek TH çalıştı:

{-# 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 

Hata:

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

Yardım! Bu Data.Text varsayılan olarak kullanmak için tüm tavsiyelerde verilen kutunun dışında işe yaramazsa şaşırtıcı. belgelerine

+0

Printf paketi alın ve PrintfArg sınıf ve kullanımını ihracat yerine her zamanki paketin söyledi. – augustss

+1

@augustss: printf tabanlıdır, ayrı bir paket değildir. Kullanıcıların kendi PrintfArg örneklerini oluşturabilmeleri için yeterli miktarda dışa aktarılabilir. –

+1

Tüm tip sınıflarını ve türlerini ortaya çıkarmak için bir Text.Printf.Internal modül ekleyeceğim. – augustss

cevap

11

UYARI : Metin formatı kaldırılmamış, yazardan 2 yıl yanıtsız. Diğer cevapları gör.


Ben text-format paketin bakarsınız: Bu Text.Printf benzer, ancak özellikle Data.Text.Lazy için tasarlanmış.

Text.Printf üzerinde metin biçiminde bir kaç başka avantajı vardır: yeni parametre türlerini desteklemek için uzatılabilir böylece

  • Buildable sınıfı maruz kalmaktadır.
  • accessing the return value ile Text.Printf'da bulunan sorunların dışına çıkan varargs için daha basit bir yaklaşım kullanır.
  • Birkaç nedenden dolayı, çok daha hızlı olması gerekir:
    • asla verimsiz String temsil dönüştürür;
    • Text.Printf'da UPrintf'un aksine ara veri türleri oluşturmaz;
    • yaklaşık 30 times faster Prelude yöntemlerine göre olan Double ve Float oluşturma için double-conversion paketi kullanır.
+0

Teşekkürler, "TF.print" Girişini yapıyordum: Giriş: {} \ n "$ TF.Yalnızca giriş". –

+9

Klasik printf formatlama işlevlerini '% .02f' ile nasıl yapıyorsunuz? –

+0

Data.Text.Format.Format'ın IsString örneğinin okuma şeklini gösteren belgeler var mı? Standart 'printf' formatındaki karakterleri kullanabilir miyim? –

1

:

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

sen (TH ihracat kısıtlamalarını dikkate almaz çünkü) kolay çözüm muhtemelen printf' tip fonksiyonudur HPrintfType örneklerini oluşturmak için TH kullanabilirsiniz iken:

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

Çalışmaz ya: src/Main.hs: 12: 'printt' Olası düzeltme bir kullanımından kaynaklanan (PrintfArg Metin) için örnek : 3 (PrintfArg Metin) için bir örnek bildirimi ekleyin Bir 'do' bloğunun bir stmt: printt "Giriş:% s" giriş İfadede: do {let input :: Text = "abc"; printt "Girdi:% s" girişi} 'Ana' denkleminde: main = do {let input :: Text = ...; printt "Giriş:% s" girişi} –

+0

Ohh, ne kadar aptalım. Açıkçası faydalı olacak format dizisinden daha fazlasını istersiniz. Bence örneği printf modülüne eklemeniz veya TH'yi kullanmanız gerekecek. –

1

incelemeye değer bir başka paket: 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

, C-kütüphanesi bağımlılıklarına sahipmiş gibi görünüyor? Bazı çift dönüştürme ... –

+0

Artık çift dönüştürme veya metin biçimine bağlı değil. –