haskell で ruby の split や PHP の explode にあたるようなものを考えました。
背景
haskell を使ったことがなく、使う場面もなかなかないので CodeIQ で使ってみようと思ったものの、 「入力を受け取るにはどうすればいいんだ?」という疑問にぶちあたり、 split する方法を考えました。
Haskell には Data.List.Split
モジュール内 に splitOn
という関数があるのですが、 CodeIQ でコンパイルに失敗しました。 Ideone でも コンパイルに失敗しました。 ほかにも関数はあるそうなのですが、うまくいかなかったので自分で考えることにしました。
カンマで分割する方法
下のようになりました。 この方法だと カンマ でのみ区切ります。
1 2 3 4 5 6 7 8 9 10 |
split = _split [] _split ts "" = ts _split ts s = _split (ts ++ [(token s)]) (drop (length(token s) + 1) s) token = _token "" _token ys "" = ys _token ys (x:xs) = do if x == ',' then ys else _token (ys ++ [x]) xs |
任意のデリミタで分割する方法
任意のデリミタを指定できるようにしてみました。 1文字のデリミタでのみ分割可能です。
1 2 3 4 5 6 7 |
split d = _split d [] _split d cs "" = cs _split d cs s = _split d (cs ++ [token d s]) (drop (length(token d s) + 1) s) token d = _token d "" _token d t "" = t _token d t (x:xs) = if (x == d) then t else _token d (t ++ [x]) xs |