@@ -10,15 +10,15 @@ tags: 日本語
1010...
1111---
1212
13- # ℹ️この記事は
13+ # ℹ️この記事は🎄
1414
1515この記事は、[ Haskell Advent Calendar 2019] ( https://qiita.com/advent-calendar/2019/haskell ) 22日目の記事です。
16- 例年どおりタイプセーフプリキュア!の話をするつもりでしたが、ネタが実装できなかったのでunicode-showの話をします [ ^ precure ] 。
16+ 例年どおりタイプセーフプリキュア!の話をするつもりでしたが、ネタが実装できなかったので [ unicode-show ] ( http://hackage.haskell.org/package/unicode-show ) の話をします [ ^ precure ] 。
1717まぁ、こちらの方がみなさんにとっては有益でしょうし🙃
1818
1919[ ^ precure ] : 例年どおりですとプリキュアAdvent Calendarと同時投稿をしている予定でしたが、例年参加者が減っていたこともあり、今年はプリキュアAdvent Calendarはなくなってしまいました😞
2020
21- # 🇯🇵 日本語(などの)話者がHaskellを始めるとあるある
21+ # 日本語(などの)話者がHaskellを始めるとあるある
2222
2323GHCiに日本語を入力したり...
2424
@@ -42,23 +42,24 @@ ghci> putStrLn (iimashita "ハスケル")
4242今、 " \12495\12473\12465\12523" って言いました!?
4343```
4444
45- 日本語の大半が変な文字列に変わってしまいました😥。
45+ すると、 日本語の大半が変な文字列に変わってしまいました😥。
4646
47- へ...、 変な文字列じゃないし!エスケープシーケンスに変換しただけだから!
47+ へ... 変な文字列じゃないし!エスケープシーケンスに変換しただけだから!
4848
4949これは、Haskell標準における` show ` 関数の残念な仕様です。
5050` show ` 関数に文字列を渡すと、ダブルクォートで囲った上で、ASCII範囲外の文字列や、ASCIIの非表示文字などをエスケープシーケンスに変換して返します。
5151これは、` show ` 関数をデバッグで使用した際、指定した文字列にどんな文字が含まれているか、簡単にわかるようにするための仕様です。
52- 文字の文字コードを表示すれば、例えばNULL文字や制御文字にゼロ幅文字 、特殊なスペースなど、視認しにくいおかしな文字が含まれていても、一目でわかるのです。
52+ 文字の文字コードを表示すれば、NULL文字や制御文字、ゼロ幅文字 、特殊なスペースなど、視認しにくいおかしな文字が含まれていても、一目でわかるのです。
5353
5454しかしこれは日本語話者である我々にとって、少なくとも日本語の文字に関しては「余計なお世話」です。
5555NULL文字やASCIIの制御文字といった本来画面に表示することがない文字列ならともかく、ASCII範囲外の文字列すべてをエスケープしてしまうのはやり過ぎでしょう。
5656現代はUnicodeがあるおかげで、日本語に限らずともASCII範囲外の文字を扱うのは当たり前になりましたから。
5757
58- # unicode-showを使おう
58+ # 🌐 unicode-showを使おう
5959
6060そこで便利なのが[ unicode-show] ( http://hackage.haskell.org/package/unicode-show ) です。
61- unicode-showの` ushow ` 関数は、` show ` がエスケープシーケンスに変換した日本語などの文字列を元の文字列に戻してくれるのです。
61+ unicode-showの` ushow ` 関数は、` show ` がエスケープシーケンスに変換した日本語などの文字列を、元の文字列に戻してくれます。
62+ なので、新しい型クラスを定義する必要もなく、そのまま` Show ` 型クラスのインスタンスを再利用できるのです。
6263
6364早速先ほどの` show ` を使った例に適用してみましょう。
6465
@@ -121,22 +122,23 @@ import qualified Text.Show.Unicode
121122
122123< https://github.com/haskell-jp/unicode-show >
123124
124- といっても、メンテナーの名前や` LICENSE ` ファイルを書き換えて最新版をアップロードして以降特に何もしていなかったのですが<small >(バグはあるけど直すのも難しそうだし 、概ね使えるし)</small >、なんと先日、Pull requestが来ました!
125+ といっても、メンテナーの名前や` LICENSE ` ファイルを書き換えて最新版をアップロードして以降特に何もしていなかったのですが<small >([ バグはあるけど直すのも難しそう ] ( https://github.com/nushio3/unicode-show/issues/2 ) だし 、概ね使えるし)</small >、なんと先日、Pull requestが来ました!
125126
126127[ Do not show values eagerly by Kaiepi · Pull Request #4 · haskell-jp/unicode-show] ( https://github.com/haskell-jp/unicode-show/pull/4 )
127128
128- この修正前のunicode -showは、文字列全体を評価してからエスケープシーケンスを元に戻す、という挙動だったため、長い文字列を与えた場合や無限の長さの文字列を与えた場合に、なかなか<small >(あるいは永遠に)</small >結果が返ってこないという問題がありました。
129+ この修正を適用する前のunicode -showは、文字列全体を評価してからエスケープシーケンスを元に戻す、という挙動だったため、長い文字列を与えた場合や無限の長さの文字列を与えた場合に、なかなか<small >(あるいは永遠に)</small >結果が返ってこないという問題がありました。
129130
130131``` haskell
131132ghci> uprint (repeat " ああああ!" )
132- -- Ctrl + C を押すまで結果が返ってこない
133+ -- 何も表示されず、 Ctrl + C を押すまで処理が返らない
133134```
134135
135136修正後はちゃんと遅延評価を利用することで、無限の長さの文字列でも少しずつ変換することができます。
136137
137138``` haskell
138139ghci> uprint (repeat " ああああ!" )
139140[" ああああ!" ," ああああ!" , ... " ああああ!" ," ああInterrupted.
141+ -- Ctrl + Cを押すまで出力し続ける
140142```
141143
142144今日記事にした一番の理由はこの話をするためです。
0 commit comments