人気ブログランキング | 話題のタグを見る

splitBy

Data.List 1にコンマ区切りのデータをリストで取り出す関数がなかったので作ってみた。実行例は次のようになる。

Prelude> :l "splitby.hs"
[1 of 1] Compiling Main ( splitby.hs, interpreted )
Ok, modules loaded: Main.
*Main Prelude> splitBy ',' "apple,orange,banana"
["apple","orange","banana"]
*Main Prelude> splitBy ',' "apple"
["apple"]
*Main Prelude> splitBy ',' ""
[]

プログラムは次のようになる。Prelude の関数 break を利用しているので他のモジュールをインポートする必要がない。

ファイル名 : splitby.hs

splitBy s [] = []
splitBy s xs =
  let brk = break (== s) xs
      first = fst brk
      rest = snd brk
  in if rest == "" then [first]
     else first : splitBy s (tail rest)

splitBy の反対にリストのデータからコンマ区切りの文字列に変換する関数 separateBy は、Data.List モジュールの intersperse 関数を使って次のように定義できる。

Prelude Data.List> :m Prelude
Prelude> :m Data.List
Prelude Data.List> let separateBy s xs = concat $ intersperse [s] xs
Prelude Data.List> separateBy ',' ["apple","orange","banana"]
"apple,orange,banana"

これでコンマ区切りのデータのデコーディングとエンコーディングが簡単にできる。しかし、Haskell には words, unwords のようなスペースがセパレータの場合の標準関数があるので、データの保存と読み込みを簡単に行うには、普通はこれを利用したほうがいいだろう。
by tnomura9 | 2013-01-10 01:08 | Haskell | Comments(0)
<< quotedString Sweet Time >>