Tutti sanno Show
. Ma che dire:Esiste un equivalente del tipo di classe Show per Data.Text?
class ShowText a where
showText :: a -> Text
Non riesco a trovarlo da nessuna parte. Perché?
Tutti sanno Show
. Ma che dire:Esiste un equivalente del tipo di classe Show per Data.Text?
class ShowText a where
showText :: a -> Text
Non riesco a trovarlo da nessuna parte. Perché?
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 #-}
Sia in preludio di base che in preludio di classe c'è [tshow] (https://www.stackage.org/lts-8.23/hoogle?q=tshow) – mb21
E 'banale per scrivere la propria funzione piggybacking fuori Show
:.
showText :: Show a => a -> Text
showText = pack . show
Questo ha un impatto sulle prestazioni? cioè, non sto creando un grande 'String', quindi convertendolo in' Text', piuttosto che creare direttamente il 'Text'? – jameshfisher
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
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
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.
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
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. –
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).
In entrambi basic-prelude e classy-prelude c'è una funzione tshow
ora.
tshow :: Show a => a -> Text
Se si utilizza il preludio di serie, provare il text-show library.
Questa è la risposta corretta, al punto,! – sandwood
http://hackage.haskell.org/packages/archive/bytestring-show/0.3.5.1/doc/html/Text-Show-ByteString.html – applicative