[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

Index

Feed

Other

Link

Pathtraq

loading...