diff options
| author | Jan Sucan <jan@jansucan.com> | 2023-03-22 16:59:04 +0100 |
|---|---|---|
| committer | Jan Sucan <jan@jansucan.com> | 2023-03-22 16:59:04 +0100 |
| commit | c4a0f5a701698881f679b5d5d2153e127d9b19df (patch) | |
| tree | f74be4cbaa97b4ee7788236b43fc364eb3ffb016 /ch04 | |
| parent | ca95e3929826664716cecc73b4efd0c5ce766ccf (diff) | |
4_b_7: Add solution
Diffstat (limited to 'ch04')
| -rw-r--r-- | ch04/4_b_7.hs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/ch04/4_b_7.hs b/ch04/4_b_7.hs new file mode 100644 index 0000000..7cfe383 --- /dev/null +++ b/ch04/4_b_7.hs @@ -0,0 +1,40 @@ +-- Write your own definition of the standard takeWhile function, first using +-- explicit recursion, and then foldr. + +myTakeWhileRecursive :: (a -> Bool) -> [a] -> [a] +myTakeWhileRecursive f (x:xs) = if f x + then x:(myTakeWhileRecursive f xs) + else [] +myTakeWhileRecursive _ [] = [] + + +myTakeWhileFoldr :: (a -> Bool) -> [a] -> [a] +myTakeWhileFoldr f xs = foldr op [] xs + where op x acc = if f x + then x:acc + else [] -- Folding from the right. When function f is false for x, + -- the accumulated list is thrown away, thus eventually + -- keeping only the leftmost sublist for which the f is + -- true for all its items. + +-- ghci> :l 4_b_7.hs +-- [1 of 1] Compiling Main ( 4_b_7.hs, interpreted ) +-- Ok, one module loaded. +-- ghci> takeWhile odd [] +-- [] +-- ghci> takeWhile odd [2, 1] +-- [] +-- ghci> takeWhile odd [1, 3, 2, 7] +-- [1,3] +-- ghci> myTakeWhileRecursive odd [] +-- [] +-- ghci> myTakeWhileRecursive odd [2, 1] +-- [] +-- ghci> myTakeWhileRecursive odd [1, 3, 2, 7] +-- [1,3] +-- ghci> myTakeWhileFoldr odd [] +-- [] +-- ghci> myTakeWhileFoldr odd [2, 1] +-- [] +-- ghci> myTakeWhileFoldr odd [1, 3, 2, 7] +-- [1,3] |
