Я начал изучать Haskell вчера, так что поправьте меня, если я ошибаюсь, но:
split :: Eq a => a -> [a] -> [[a]]
split x y = func x y [[]]
where
func x [] z = reverse $ map (reverse) z
func x (y:ys) (z:zs) = if y==x then
func x ys ([]:(z:zs))
else
func x ys ((y:z):zs)
дает:
*Main> split ' ' "this is a test"
["this","is","a","test"]
или, может быть, вы хотели
*Main> splitWithStr " and " "this and is and a and test"
["this","is","a","test"]
который будет:
splitWithStr :: Eq a => [a] -> [a] -> [[a]]
splitWithStr x y = func x y [[]]
where
func x [] z = reverse $ map (reverse) z
func x (y:ys) (z:zs) = if (take (length x) (y:ys)) == x then
func x (drop (length x) (y:ys)) ([]:(z:zs))
else
func x ys ((y:z):zs)
Data.List
или дажеPrelude
. Это так распространено и неприятно, если не доступно для код-гольфа.