Skip to content

Commit ee175b7

Browse files
committed
Many fixes
1 parent 467878f commit ee175b7

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

preprocessed-site/posts/2019/unicode-show.md

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2323
GHCiに日本語を入力したり...
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
しかしこれは日本語話者である我々にとって、少なくとも日本語の文字に関しては「余計なお世話」です。
5555
NULL文字や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
131132
ghci> uprint (repeat "ああああ!")
132-
-- Ctrl + C を押すまで結果が返ってこない
133+
-- 何も表示されず、Ctrl + C を押すまで処理が返らない
133134
```
134135

135136
修正後はちゃんと遅延評価を利用することで、無限の長さの文字列でも少しずつ変換することができます。
136137

137138
```haskell
138139
ghci> uprint (repeat "ああああ!")
139140
["ああああ!","ああああ!", ... "ああああ!","ああInterrupted.
141+
-- Ctrl + Cを押すまで出力し続ける
140142
```
141143
142144
今日記事にした一番の理由はこの話をするためです。

0 commit comments

Comments
 (0)