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 を使う必要がある.
とりあえずここまで.