今日少し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 件のコメント:
コメントを投稿