火曜日, 11月 18, 2008

Haskellを使ってみる (6)

今日少しHaskellを触っていて、「ファイル名のbasenameを取得する」コードを書こうとしばし悩んでました。んで書いたコードがこれ。

basename ext inname =     join "." \$ reverse \$              (\name ->                   if (head name)==ext then tail name                   else name) \$ reverse \$ split '.' \$ inname

"."をデリミタにしてリストに分割して逆順にして、先頭に拡張子が入っているかを確認したうえで先頭を削除して、正順に戻して"."を挟んで文字列に戻してます。んでこれを書くのに使っている補助関数が

split :: Char -> String -> [String] split _ "" = [""] split delim (c:cs)       | c == delim = "" : remains       | otherwise  = (c: head remains) : tail remains       where         remains = split delim cs join :: String -> [String] -> String join _ [] = "" join delim (c:cs) = c ++ delim ++ (join delim cs)

でもこんなの既に用意されているような気がしてなりません。

0 件のコメント: