diff options
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | ch04/4_a_2.hs | 25 |
2 files changed, 26 insertions, 1 deletions
@@ -69,7 +69,7 @@ more visible in the list the first exercise of a group is in bold italics. | 3_b_11 | yes, in 3_b_9 | | | | 3_b_12 | yes, in 3_b_9 | | | | **_4_a_1_** | yes | 84 | 4. Functional programming | -| 4_a_2 | | | | +| 4_a_2 | yes | | | | 4_a_3 | | | | | 4_a_4 | | | | | **_4_b_1_** | | 97 | | 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]] |
