2012-06-11 16 views

risposta

11

La libreria text-show esiste ora e risolve esattamente questo problema.

Update (2016 Feb 12)

La funzione show fornito nella libreria basic-prelude rende anche direttamente al testo:

show :: Show a => a -> Text 

basic-prelude ha anche un minor numero di dipendenze rispetto text-show. Se si desidera utilizzare basic-prelude, salva te stesso mal di testa di compilazione aggiungendo il seguente alla parte superiore del file di origine:

{-# LANGUAGE NoImplicitPrelude #-} 
+0

Sia in preludio di base che in preludio di classe c'è [tshow] (https://www.stackage.org/lts-8.23/hoogle?q=tshow) – mb21

2

E 'banale per scrivere la propria funzione piggybacking fuori Show:.

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

Questo ha un impatto sulle prestazioni? cioè, non sto creando un grande 'String', quindi convertendolo in' Text', piuttosto che creare direttamente il 'Text'? – jameshfisher

+2

Non perdi tutti i vantaggi nell'usare Data.Text in questo modo? Tu usi Text principalmente a causa dei problemi di prefromance di 'String' - e in questo modo getti tutti i guadagni ... – Sventimir

+0

Dato che il typeclass' Show' in pratica richiede solo 'show :: a -> String', non c'è alcun modo implementare 'showText' senza passare attraverso una stringa. Anche le funzioni 'tshow' nel preludio di base e di classe sono implementate in questo modo. – mb21

14

Il problema con la creazione del testo direttamente è ancora bisogno di conoscere la dimensione complessiva del blocco di testo rigoroso prima di riempirlo in è possibile fare meglio con uno schema Builder e utilizzare Data.Text. Lazy. Dan Doel fa questo in bytestring-show, ma non sono a conoscenza di un equivalente per il testo.

+0

Parlare di funzioni di lettura/visualizzazione ...È possibile trasformare una coppia di ("funzione di lettura che può non riuscire", "mostra funzione") per un determinato tipo di dati in un Prisma da Control.Lens? – danidiaz

+0

Sì! Hai bisogno della possibilità di eseguire il comando 'Leggi 'e scoprire se è stato abbinato o meno, che è stato aggiunto solo di recente alla base. –

5

Nel caso particolare di Int valori, ecco il codice per convertirli in severe Text valori senza utilizzare Strings in una fase intermedia:

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 

modulo Data.Text.Lazy.Builder.RealFloat offre funzionalità simili per valori a virgola mobile.

Con questi possiamo definire una nostra versione del Show typeclass:

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 

Poi possiamo iniziare ad aggiungere più istanze (una per tuple sarebbe utile per esempio).

Problemi correlati