Всем известно Show
. Но как насчет:
class ShowText a where
showText :: a -> Text
Я ничего не могу найти. Почему?
Всем известно Show
. Но как насчет:
class ShowText a where
showText :: a -> Text
Я ничего не могу найти. Почему?
Теперь существует библиотека text-show и решает именно эту проблему.
Обновление (2016 12 февраля)
Функция show
, предоставленная в библиотеке basic-prelude, также прямо передает текст:
show :: Show a => a -> Text
basic-prelude
также имеет меньшее количество зависимостей, чем text-show
. Если вы хотите использовать basic-prelude
, сохраните головные боли компиляции, добавив следующее в начало исходного файла:
{-# LANGUAGE NoImplicitPrelude #-}
Проблема с созданием текста напрямую - вам все равно нужно знать общий размер строкового блока Text перед его заполнением. Вы можете сделать лучше с помощью схемы Builder и использовать Data.Text.Lazy. Дэн Доэл делает это в bytestring-show, но я не знаю эквивалента для текста.
Для конкретного случая значений 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
Затем мы можем начать добавлять больше экземпляров (например, для кортежей было бы полезно).
Это тривиально, чтобы написать свою собственную функцию, отключающую Show
:
showText :: Show a => a -> Text
showText = pack . show
В basic-prelude и classy-prelude теперь есть функция tshow
.
tshow :: Show a => a -> Text
Если вы используете стандартную прелюдию, попробуйте текстовую библиотеку.