Посмотрите на проблему: обычно в интерактивной среде 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
и показывают
используются для форматирования результата, и эти функции делают все возможное, чтобы форматировать данные каноническим, максимально переносимым способом - поэтому они предпочитают избегать странных символов (возможно, это даже прописано в стандарте для 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
, т.е. без экранирования.)
(Возможно, помимо GHCi и Hugs98, я также посмотрю на существующие режимы Emacs для взаимодействия с Haskell, чтобы увидеть, могут ли они представить результаты в красивом, неэкранированном виде. мода.)