From c4a0f5a701698881f679b5d5d2153e127d9b19df Mon Sep 17 00:00:00 2001 From: Jan Sucan Date: Wed, 22 Mar 2023 16:59:04 +0100 Subject: 4_b_7: Add solution --- ch04/4_b_7.hs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 ch04/4_b_7.hs (limited to 'ch04') 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] -- cgit v1.2.3