28

誰もが知っていShowます。しかし、どうですか:

class ShowText a where
  showText :: a -> Text

これはどこにも見つかりません。なんで?

4

5 に答える 5

15

テキストを直接作成する場合の問題は、テキストを入力する前に、厳密なテキストブロックの全体的なサイズを知る必要があることです。BuilderスキームとData.Text.Lazyを使用すると、より適切に処理できます。Dan Doelはこれをbytestring-showで行いますが、Textに相当するものを私は知りません。

于 2012-06-11T23:57:17.250 に答える
14

ライブラリのテキストショーが現在存在し、この問題を正確に解決します。

更新(2016年2月12日)

basic-preludeライブラリで提供されるshow関数も、テキストに直接レンダリングします。

show :: Show a => a -> Text

basic-preludeまた、依存関係は。よりも少なくなりtext-showます。を使用する場合basic-preludeは、ソースファイルの先頭に以下を追加して、コンパイルの問題を回避してください。

{-# LANGUAGE NoImplicitPrelude #-} 
于 2014-11-17T05:20:44.433 に答える
5

値の特定のケースについて、中間段階で使用せずに厳密な値Intに変換するコードは次のとおりです。TextStrings

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は、浮動小数点値に対して同様の機能を提供します。

Showこれらを使用して、タイプクラスの独自のバージョンを定義できます。

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

次に、インスタンスの追加を開始できます(たとえば、タプル用のインスタンスが役立ちます)。

于 2013-08-15T09:16:10.087 に答える
2

ピギーバックする独自の関数を作成するのは簡単Showです。

showText :: Show a => a -> Text
showText = pack . show
于 2012-06-11T22:31:04.693 に答える
1

ベーシックプレリュードクラッシープレリュードの両方に機能が追加されましたtshow

tshow :: Show a => a -> Text

標準のプレリュードを使用している場合は、text-showライブラリを試してください。

于 2017-08-14T11:51:30.547 に答える