問題を見てください: 通常、インタラクティブな 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 のチュートリアル/デモンストレーションを行う場合に高く評価されます。
実際、教育目的だけでなく、デバッグにも役立ちます。ASCII 以外の文字を使用して、他の言語の単語を表す文字列に対して定義された関数がある場合。そのため、プログラムが言語固有であり、別の言語の単語のみがデータとして意味を持ち、そのような単語に対してのみ定義された関数がある場合、GHCi でのデバッグではこのデータを確認することが重要です。
私の質問を要約すると:既存の対話型 Haskell 環境をハックして、結果に Unicode をよりわかりやすく表示する方法はありますか? (私の場合、「親しみやすい」とは「より単純」であることを意味します: print
GHCi または Hugs で非ラテン文字をputChar
、 , putStrLn
、つまりエスケープされていない単純な直接的な方法で表示したいと思います。)
(おそらく、GHCi と Hugs98 に加えて、Haskell と対話するための既存の Emacs モードも見て、それらがきれいなエスケープされていない方法で結果を表示できるかどうかを確認します。)