Comment detail

文字列の反転(括弧の対応を保存) (Nested Flatten)
Haskell練習中。
あまり美しくないなあ。
ghciで日本語はどう使うのかなあ。

実行例
*Main> reverseString2 "mojiretsu(MOJIRETSU) no hanten(HANTEN)."
".(NETNAH)netnah on (USTERIJOM)usterijom"
*Main> reverseString2 "taiou[no{toreteiru(samazamana)kakko}no(rei)]desu."
".used[(ier)on{okkak(anamazamas)urieterot}on]uoiat"
*Main> reverseString2 "kore(ha(taiounotoreteinai)kakkonoarureidesu."
".usedieruraonokkak(ianieterotonuoiat)ah(erok"
*Main> reverseString2 "kore(mo{taiouno)toreteinai}kakkonoreidesu."
".usedieronokkak}ianieterot)onuoiat{om(erok"
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
parens = [('(',')'), ('[',']'), ('{','}')]

isOpener c = elem c $ map fst parens
isCloser c = elem c $ map snd parens

closer p = case lookup p parens of
             Just q -> q
             Nothing -> error "huh?"

revs [] rs zs = ([],rs++zs)
revs (x:xs) rs zs
  | isOpener x = case revs xs [] [x] of
                   (xs',rs') -> revs xs' (rs'++rs) zs
  | isCloser x = case zs of
                   [z] | x == closer z -> (xs, [z]++rs++[x])
                   _                   -> (xs, [x]++rs++zs)
  | otherwise  = revs xs (x:rs) zs

reverseString2 s = snd $ revs s [] []
ghcで日本語を正しく扱うには,いまのところ入出力の際に UTF8 <-> 内部コード
という変換をする必要があります.この変換を行うモジュールは以前自前で書いた
ことがあるのですが,今は Hackage DB に登録されています.

http://hackage.haskell.org/cgi-bin/hackage-scripts/package/utf8-string-0.2

インストール手順は以下のとおりです.

$ wget http://hackage.haskell.org/packages/archive/utf8-string/0.2/utf8-string-0.2.tar.gz
$ tar xf utf8-string-0.2.tar.gz
$ cd utf8-string-0.2
$ runhaskell Setup.lhs configure
$ runhaskell Setup.lhs build
$ sudo runhaskell Setup.lhs install

これで Codec.Binary.UTF8.String と System.IO.UTF8 モジュールが使えるように
なります.

$ ghc-pkg -l | grep utf8 

とやるとこのパッケージがインストールされたかどうか確認できます.
ghci には直接 UTF8 の文字列リテラルを入力できない(orz)ので,ソースコードに
定数として仕込んでおく必要があります.ソースコードのエンコーディングを
UTF8 にして

sample0 = "文字列(もじれつ)の反転(はんてん)"
sample1 = "対応[の{とれている(さまざまな)括弧}の(例)]です。"
sample2 = "これ(は(対応のとれてない)括弧がある例です。"
sample3 = "これ(も{対応の)とれていない}括弧の例です。"

というのをソースコード(3511.hs)にいれておきますそうしておいて,
- ghci を起動.
- System.IO.UTF8 を追加.
- 出力用 wrapper を追加.
- wrapper をつかって結果を表示

$ ghci -v0 3511.hs
*Main> :m + System.IO.UTF8
*Main System.IO.UTF8> let wrapper = (System.IO.UTF8.putStrLn .)
*Main System.IO.UTF8> wrapper reverseString2 sample0
(んてんは)転反の(つれじも)列字文
*Main System.IO.UTF8> wrapper reverseString2 sample1
。すで[(例)の{弧括(なまざまさ)るいてれと}の]応対
*Main System.IO.UTF8> wrapper reverseString2 sample2
。すで例るあが弧括(いなてれとの応対)は(れこ
*Main System.IO.UTF8> wrapper reverseString2 sample3
。すで例の弧括}いないてれと)の応対{も(れこ

ああ面倒 ^^;

Index

Feed

Other

Link

Pathtraq

loading...