[topic] 末尾の空白文字を取り除く
Posted feedbacks - Haskell
一番わかりやすいのは, ・文字列を反転 ・前から文字を辿って空白である間それを落す ・もう一度反転する これが,trim0 なのですが,この場合与えられた文字列を2回たどることになります. 与えられた文字列をどるのを1回にするには foldr を使って畳み込むという手があります. これが trim1です. Haskellですから当然文字列を破壊することはできません. 空白文字を判定するのは Data.Char モジュールの の isSpace です isSpace で空白と判定される文字コードはghciのプロンプトで以下のようにすると列挙できます。 % ghci -v0 Prelude> :m + Data.Char Text.Printf Prelude Text.Printf Data.Char> mapM_ (printf "0x%02x\n") $ map ord $ filter isSpace [minBound .. maxBound] 0x09 0x0a 0x0b 0x0c 0x0d 0x20 0xa0 0x1680 0x180e 0x2000 0x2001 0x2002 0x2003 0x2004 0x2005 0x2006 0x2007 0x2008 0x2009 0x200a 0x200b 0x202f 0x205f 0x3000
1 2 3 4 5 | import Data.Char
trim0 = reverse . dropWhile isSpace . reverse
trim1 = foldr (\ c cs -> if null cs && isSpace c then "" else c:cs) ""
|
毎回 null cs をチェックするのが癪なのでチェックしないバージョン。 末尾が空白でなければコピーでなく与えられた文字列そのものを返します。 実質は状態遷移してるだけです。 読みづらい。もしかしたら実行効率も落ちてるかも。 でもそんなの関………
1 2 3 4 5 6 7 8 9 10 | import Char (isSpace)
data T a = T [a] (a -> [a] -> T a)
trim2 xs = str where
T str _ = foldr (\c (T cs f) -> f c cs) (T xs lastCheck) xs
lastCheck c cs = if (isSpace c) then (T [] trailCheck) else (T cs pass)
trailCheck c _ = if (isSpace c) then (T [] trailCheck) else (T [c] cons)
pass _ cs = T cs pass
cons c cs = T (c:cs) cons
|






にしお
#4175()
Rating0/0=0.00
与えられた文字列の末尾の空白文字を取り除く方法と、その操作が与えられた文字列を破壊するかどうか。取り除かれる空白文字の種類。
[ reply ]