Haskell で文字列処理

http://d.hatena.ne.jp/sakura-1/20100113
このへん見てたしかにこういうのがあると役立つなぁと思ったので.


まず始めに,Haskell で文字列を扱う場合は主に String を使い,これは Char のリストになっている.
もっと効率的に文字列を扱いたい場合には ByteString を使うこともできる.
http://www.haskell.org/ghc/docs/6.10-latest/html/libraries/bytestring/Data-ByteString.html

文字列の結合

一般のリスト操作系の関数 (++) で結合できる.

Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
Prelude> "foo" ++ "bar"
"foobar"

繰り返し文字列を生成する

これも一般のリスト操作系の関数 replicate と concat の組み合わせでできる.

Prelude> :t replicate
replicate :: Int -> a -> [a]
Prelude> :t concat
concat :: [[a]] -> [a]
Prelude> concat . replicate 3 $ "Hey "
"Hey Hey Hey "

大文字・小文字に揃える

Data.Char モジュールの toLower, toUpper を使う.

Prelude> :m +Data.Char
Prelude Data.Char> :t toUpper
toUpper :: Char -> Char
Prelude Data.Char> map toUpper "I love Haskell"
"I LOVE HASKELL"
Prelude Data.Char> :t toLower
toLower :: Char -> Char
Prelude Data.Char> map toLower "I love Haskell"
"i love haskell"

大文字と小文字の入れ替え

これはちょっとめんどくさいですね…
ちゃんとやるなら

import Data.Char

swapCase :: Char -> Char
swapCase c
  | isUpper c = toLower c
  | isLower c = toUpper c
  | otherwise = c

と定義して

*Main> map swapCase "I Love Haskell"
"i lOVE hASKELL"

というかんじだろうか.

コマンドの結果を文字列に設定する

最初は自分でパイプ作って読み出すしかないかなぁと思ったら @koyama41 さんから readProcessWithExitCode を教えていただきました.ありがとうございます.
しかし,これが使えるのは GHC 6.10.x 以降のようです.
http://www.haskell.org/ghc/docs/6.8-latest/html/libraries/process/System-Process.html
http://www.haskell.org/ghc/docs/6.10-latest/html/libraries/process/System-Process.html#v%3AreadProcessWithExitCode
今回はそれの簡易版の readProcess で十分.
もちろんこれは副作用を持つので IO の印がつく.

Prelude> :m +System.Process
Prelude System.Process> :t readProcess
readProcess :: FilePath -> [String] -> String -> IO String
Prelude System.Process> readProcess "date" [] "" >>= putStrLn
Loading package filepath-1.1.0.3 ... linking ... done.
Loading package old-locale-1.0.0.2 ... linking ... done.
Loading package old-time-1.0.0.3 ... linking ... done.
Loading package unix-2.4.0.0 ... linking ... done.
Loading package directory-1.0.1.0 ... linking ... done.
Loading package process-1.0.1.2 ... linking ... done.
2010年 1月15日 金曜日 20時22分43秒 JST

ちなみに今は GHC 6.12.1 を使っているので日本語が正しく表示されているが,それより前のバージョンでは System.IO.UTF8 の putStrLn を使う必要がある.


とりあえずここまで.