Подтвердить что ты не робот

Есть ли эквивалент класса Show для Data.Text?

Всем известно Show. Но как насчет:

class ShowText a where
  showText :: a -> Text

Я ничего не могу найти. Почему?

4b9b3361

Ответ 1

Теперь существует библиотека text-show и решает именно эту проблему.

Обновление (2016 12 февраля)

Функция show, предоставленная в библиотеке basic-prelude, также прямо передает текст:

show :: Show a => a -> Text

basic-prelude также имеет меньшее количество зависимостей, чем text-show. Если вы хотите использовать basic-prelude, сохраните головные боли компиляции, добавив следующее в начало исходного файла:

{-# LANGUAGE NoImplicitPrelude #-} 

Ответ 2

Проблема с созданием текста напрямую - вам все равно нужно знать общий размер строкового блока Text перед его заполнением. Вы можете сделать лучше с помощью схемы Builder и использовать Data.Text.Lazy. Дэн Доэл делает это в bytestring-show, но я не знаю эквивалента для текста.

Ответ 3

Для конкретного случая значений Int здесь приведен код для преобразования их в строгие значения Text без использования Strings на промежуточной стадии:

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

Затем мы можем начать добавлять больше экземпляров (например, для кортежей было бы полезно).

Ответ 4

Это тривиально, чтобы написать свою собственную функцию, отключающую Show:

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