Посмотрите на проблему. Обычно в интерактивной среде Haskell символы латинского Unicode (которые составляют часть результатов) печатаются с экранированием, даже если локаль допускает такие символы (в отличие от прямого вывода через putStrLn
, putChar
, который выглядит хорошо и читаемо) - примеры показывают GHCi и Hugs98:
$ ghci
GHCi, version 7.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> "hello: привет"
"hello: \1087\1088\1080\1074\1077\1090"
Prelude> 'Я'
'\1071'
Prelude> putStrLn "hello: привет"
hello: привет
Prelude> :q
Leaving GHCi.
$ hugs -98
__ __ __ __ ____ ___ _________________________________________
|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005
||---|| ___|| World Wide Web: http://haskell.org/hugs
|| || Bugs: http://hackage.haskell.org/trac/hugs
|| || Version: September 2006 _________________________________________
Hugs mode: Restart with command line option +98 for Haskell 98 mode
Type :? for help
Hugs> "hello: привет"
"hello: \1087\1088\1080\1074\1077\1090"
Hugs> 'Я'
'\1071'
Hugs> putStrLn "hello: привет"
hello: привет
Hugs> :q
[Leaving Hugs]
$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
$
Мы можем предположить, что это потому, что print
и show
используются для форматирования результата, и эти функции делают все возможное, чтобы форматировать данные в каноническом, максимально переносимом виде - поэтому они предпочитают избегать странных символов (возможно, это даже указано в стандарте для Haskell):
$ ghci
GHCi, version 7.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> show 'Я'
"'\\1071'"
Prelude> :q
Leaving GHCi.
$ hugs -98
Type :? for help
Hugs> show 'Я'
"'\\1071'"
Hugs> :q
[Leaving Hugs]
$
Но все же было бы неплохо, если бы мы знали, как взломать GHCi или Hugs, чтобы напечатать эти персонажи с помощью удобного для восприятия человеком, т.е. напрямую, без привязки. Это может быть оценено при использовании интерактивной среды Haskell в образовательных целях, для учебника/демонстрации Haskell перед неанглийской аудиторией, которую вы хотите показать некоторым Haskell по данным на их человеческом языке.
Собственно, это не только полезно в образовательных целях, но и для отладки! Когда у вас есть функции, которые определены в строках, представляющих слова других языков, с символами, отличными от ASCII. Таким образом, если программа зависит от языка, и только слова другого языка имеют смысл в качестве данных, и у вас есть функции, которые определены только на таких словах, важно для отладки в GHCi видеть эти данные.
Подводя итог моему вопросу: Какие способы взлома существующих интерактивных сред Haskell для более удобной печати Unicode в результатах есть? ( "Дружелюбие" означает даже "более простой" в моем случае: мне бы хотелось, чтобы print
в GHCi или Hugs показывал нелатинским символам простой прямой путь, как это делали putChar
, putStrLn
, т.е. unescaped.)
(Возможно, помимо GHCi и Hugs98, я также посмотрю на существующие режимы Emacs для взаимодействия с Haskell, чтобы увидеть, могут ли они представить результаты в симпатичном, неограниченном виде.)