Для логирования приходится собирать строки из множества кусочков, например Log.logInfo $ "User UID-" <> tshow userId <> " has run payment for $" <> paymentAmount <> ...". Проблемы:
это трудночитаемо и громоздко из-за обилия <> и show/tshow
вероятно, это еще и непроизводительно. Пишут, что show небыстрый, а мы еще конвертим полученную String в Text вместо того, чтобы сразу выводить в Text или в Text.Builder.
show выводит сложные данные в формате, который плохо подходит для чтения. Известно, что класс Show пытается делать слишком много и ничего не делает хорошо. Он плох и для сериализации в паре с Read, и для читабельности вывода, и для настраиваемого вывода чисел и всего такого.
нет способа задать форматирование такого-то типа данных для логирования. Приходится снова и снова писать длинные выражения вида " UID-" <> tshow userId, тогда как хотелось бы определить инстанс какого-нибудь тайпкласса для UserId, писать что-то типа <> userId <> и получать унифицированное форматирование всех айдишников юзеров.
Есть Text.Printf, но его невозможно расширить - из него не экспортируются нужные тайпклассы, к которым можно было бы прикрутить вывод, скажем, в Text. А еще printf интерпретирует форматную строку в рантайме, что не так эффективно, как могло бы быть, и может откладывать до рантайма ошибки, обнаружимые во время компиляции.
В идеале хотелось бы чего-то такого: Log.logInfo [s|{userId} has run payment for ${amount:.2}]. Где-то должна быть библиотека с синтаксисом [s|....], куда можно записывать текст и последовательности, содержащие Haskell-выражения, которые будут вычислены, преобразованы в текст и вставлены в строку. Возможно, ее придется расширить, чтобы можно было использовать дополнительный тайпкласс для форматирования данных только в логи и никуда больше, и чтобы вывод был в Text или Text.Builder.
Проблема касается не только логов, а работы со строками вообще. Просто с логами приходится работать чаще.
Для логирования приходится собирать строки из множества кусочков, например
Log.logInfo $ "User UID-" <> tshow userId <> " has run payment for $" <> paymentAmount <> ..."
. Проблемы:<>
и show/tshowShow
пытается делать слишком много и ничего не делает хорошо. Он плох и для сериализации в паре сRead
, и для читабельности вывода, и для настраиваемого вывода чисел и всего такого." UID-" <> tshow userId
, тогда как хотелось бы определить инстанс какого-нибудь тайпкласса дляUserId
, писать что-то типа<> userId <>
и получать унифицированное форматирование всех айдишников юзеров.Есть Text.Printf, но его невозможно расширить - из него не экспортируются нужные тайпклассы, к которым можно было бы прикрутить вывод, скажем, в Text. А еще printf интерпретирует форматную строку в рантайме, что не так эффективно, как могло бы быть, и может откладывать до рантайма ошибки, обнаружимые во время компиляции.
В идеале хотелось бы чего-то такого:
Log.logInfo [s|{userId} has run payment for ${amount:.2}]
. Где-то должна быть библиотека с синтаксисом[s|....]
, куда можно записывать текст и последовательности, содержащие Haskell-выражения, которые будут вычислены, преобразованы в текст и вставлены в строку. Возможно, ее придется расширить, чтобы можно было использовать дополнительный тайпкласс для форматирования данных только в логи и никуда больше, и чтобы вывод был в Text или Text.Builder.Проблема касается не только логов, а работы со строками вообще. Просто с логами приходится работать чаще.