aboutsummaryrefslogtreecommitdiff
path: root/ch04/4_a_2.hs
diff options
context:
space:
mode:
Diffstat (limited to 'ch04/4_a_2.hs')
-rw-r--r--ch04/4_a_2.hs25
1 files changed, 25 insertions, 0 deletions
diff --git a/ch04/4_a_2.hs b/ch04/4_a_2.hs
new file mode 100644
index 0000000..9a14c34
--- /dev/null
+++ b/ch04/4_a_2.hs
@@ -0,0 +1,25 @@
+-- Write a function splitWith that acts similarly to words, but takes a
+-- predicate and a list of any type, and splits its input list on every element
+-- for which the predicate returns False.
+--
+-- -- file: ch04/ch04.exercises.hs
+-- splitWith :: (a -> Bool) -> [a] -> [[a]]
+
+safeTail :: [a] -> [a]
+safeTail [] = []
+safeTail xs = tail xs
+
+splitWith :: (a -> Bool) -> [a] -> [[a]]
+splitWith f [] = []
+splitWith f xs = if not (null first)
+ then first:splitRest
+ else splitRest
+ where (first, suffix) = span f xs
+ rest = safeTail suffix
+ splitRest = splitWith f rest
+
+-- ghci> :l 4_a_2.hs
+-- [1 of 1] Compiling Main ( 4_a_2.hs, interpreted )
+-- Ok, one module loaded.
+-- ghci> splitWith even [2, 1, 4, 4, 3, 3, 6, 6, 6]
+-- [[2],[4,4],[6,6,6]]