Какой наименее подробный способ конвертировать Double в Data.Text? - PullRequest
3 голосов
/ 23 июня 2011

Как мне преобразовать Double в Data.Text?

По сути, у меня был следующий код:

Data.Text.pack $ show 9.0

Этот код имеет довольно очевидную глупость.Так что я покопался в документации и придумал:

toStrict $ toLazyText $ realFloat 9.0

Это кажется лучше, но кажется, что должен быть более прямой метод, но я не могу найти ничего с типом Double ->data.text.Это лучший способ?Кажется, что если я переключусь на ленивый текст, я могу избежать этого, но я не совсем готов сделать это.

Есть ли слова мудрости?

Ответы [ 4 ]

5 голосов
/ 23 июня 2011

Вы можете использовать printf как пакет текстовый формат .

2 голосов
/ 11 апреля 2014

ClassyPrelude предоставляет класс типов Show, упомянутый в предыдущем ответе Томаса .

См. tshow и tlshow. Последний производит ленивый текст.

Обратите внимание, что реализация по умолчанию просто T.fromList . Prelude.show.

Я рекомендую прочитать блог Yesod на ClassyPrelude для получения общей информации об этом пакете. Обратите внимание, что это не замена для стандартной прелюдии.

2 голосов
/ 23 июня 2011

Кажется, должно быть class ShowText a where showT :: a -> Text не так ли?Я не большой (или даже умеренный) пользователь Text, но у Yesod есть класс:

class ToMessage a where
    toMessage :: a -> Text

С экземпляром для String, но то, что вы действительно хотите, это экземпляр дляShow a, поэтому вам нужно либо использовать неразрешимые экземпляры, либо использовать его как только экземпляра идентичного в другом классе.Жаль, что Хаскелл не позволяет вам закрывать уроки ...

РЕДАКТИРОВАТЬ: Поскольку мое мнение еще не ясно - я не вижу ничего этого, когда стоит чтоВы действительно хотите showT = pack . show как функция, экспортируемая Data.Text (для удобства).Но то, что вы действительно ДОЛЖНЫ хотеть, это вообще ничего - Text (обычно) предназначен для потребления человеком, а экземпляры Show представляют собой довольно необработанные деревья данных, полезные в основном программистам;скрещивание двух видов использования поражает меня как слияние двух интересов.

1 голос
/ 24 июня 2011

Насмешливый ответ:

f :: Double -> Data.Text
f = Data.Text.pack . show

Тогда вы просто используете

f 9.0

Не может быть гораздо более кратким, верно? Не бойтесь бросать свои собственные служебные методы для удобства (хотя они, вероятно, должны иметь более описательные имена, чем f). Если вы считаете, что это может быть полезно, обратитесь к сопровождающему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...