2012-06-11 7 views

答えて

11

ライブラリtext-showが現在存在し、この問題を正確に解決しています。

アップデート(2016年2月12日)

basic-preludeライブラリで提供show機能はまた、直テキストをレンダリングする:

show :: Show a => a -> Text 

basic-preludetext-showより少ない依存性を有します。あなたがbasic-prelude使用したい場合は、ソースファイルの先頭に次を追加することによって、自分自身のコンパイル頭痛を保存します。

{-# LANGUAGE NoImplicitPrelude #-} 
+0

基本プレリュードとクラシックプレリュードの両方に[tshow](https://www.stackage.org/lts-8.23/hoogle?q=tshow) – mb21

2

それはShowをオフに便乗独自の関数を書くこと些細です:

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

これはパフォーマンスに影響しますか?つまり、 'Text'を直接作成するのではなく、大きな' String'を作成して 'Text'に変換するのではないのですか? – jameshfisher

+2

このようにData.Textを使用することの利点をすべて失っていませんか?主に 'String'のprefromanceの問題のためにTextを使用します - そして、この方法ですべての利益を捨てます... – Sventimir

+0

' Show' typeclassは基本的に 'show :: a - > String'だけを必要とするので、方法はありませんStringを通さずに 'showText'を実装します。基本的で上品なプレリュードの 'tshow'機能もこのように実装されています。 – mb21

14

直接テキストを作成すると、問題は、あなたがまだそれを充填する前に、厳密なテキストブロック全体のサイズを知っておく必要がありますあなたができることです。 Builderスキームを使い、Data.Text.Lazyを使用する方がよいでしょう。 Dan Doelはbytestring-showでこれを行いますが、私はTextと同等のことを認識していません。 Int値の特定の場合について

+0

読み込み/表示機能について言えば...与えられたデータ型のペア( "失敗する可能性のある関数の読み込み"、 "関数の表示")をControl.Lensからプリズムに変換できますか? – danidiaz

+0

うん!あなたは 'Read'を実行し、それが一致しているかどうかを知る能力が必要です。 –

5

、ここで中間段階で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 

はその後、我々はより多くのインスタンスの追加を開始することができます(タプルのための一例のために有用であろう):これらで

我々はShow型クラスの私たち自身のバージョンを定義することができます。

関連する問題