テキストファイルから入力を受け付ける時にはよく使う。あとはカンマ区切りなんかも。
import Data.Char splitBy :: (a -> Bool) -> [a] -> [[a]] splitBy p [] = [] splitBy p xs = a : (splitBy p $ dropWhile p $ b) where (a, b) = break p xs splitBySpace :: String -> [String] splitBySpace = splitBy isSpace
*Main> splitBySpace "a b c" ["a","b","c"] *Main> splitBySpace " a b c " ["","a","b","c"]
正規表現(Text.Regex)を使えばもっとシンプルに書ける。
import Text.Regex splitBySpace' :: String -> [String] splitBySpace' = splitRegex (mkRegex " +")
*Main> splitBySpace' "a b c" ["a","b","c"] *Main> splitBySpace' " a b c " ["","a","b","c",""]
……けど,ちょっと動作が違うな。
ちなみに Ruby の String#split は上の splitBySpace と同じ動作。
D:\>irb --simple-prompt >> "a b c".split(/ +/) => ["a", "b", "c"] >> " a b c ".split(/ +/) => ["", "a", "b", "c"]