文字列を空白で区切る

テキストファイルから入力を受け付ける時にはよく使う。あとはカンマ区切りなんかも。

 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"]