diff options
| author | Jan Sucan <jan@jansucan.com> | 2023-03-16 20:05:13 +0100 |
|---|---|---|
| committer | Jan Sucan <jan@jansucan.com> | 2023-03-16 20:05:13 +0100 |
| commit | 03a11303d19993023a6b75ef639624befadfdf5a (patch) | |
| tree | e542e8e9df750f6ec1764a02f7cff7d0c89b7088 /ch04 | |
| parent | 82e61723ec378cefd56b5b351340b3d33bc490fc (diff) | |
4_a_2: Add solution
Diffstat (limited to 'ch04')
| -rw-r--r-- | ch04/4_a_2.hs | 25 |
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]] |
