summaryrefslogtreecommitdiff
path: root/Haskell-book/20/LibraryFunctions.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Haskell-book/20/LibraryFunctions.hs')
-rw-r--r--Haskell-book/20/LibraryFunctions.hs51
1 files changed, 51 insertions, 0 deletions
diff --git a/Haskell-book/20/LibraryFunctions.hs b/Haskell-book/20/LibraryFunctions.hs
new file mode 100644
index 0000000..412de32
--- /dev/null
+++ b/Haskell-book/20/LibraryFunctions.hs
@@ -0,0 +1,51 @@
+module LibraryFunctions where
+
+-- 1
+sum :: (Foldable t, Num a) => t a -> a
+sum = foldr (+) 0
+
+-- 2
+product :: (Foldable t, Num a) => t a -> a
+product = foldr (*) 0
+
+-- 3
+elem :: (Foldable t, Eq a) => a -> t a -> Bool
+elem needle = foldr (\x b -> b || (needle == x)) False
+
+-- 4
+minimum :: (Foldable t, Ord a) => t a -> Maybe a
+minimum = foldr f Nothing
+ where f x Nothing = Just x
+ f x (Just y)
+ | x > y = Just x
+ | otherwise = Just y
+
+-- 5
+maximum :: (Foldable t, Ord a) => t a -> Maybe a
+maximum = foldr f Nothing
+ where f x Nothing = Just x
+ f x (Just y)
+ | x < y = Just x
+ | otherwise = Just y
+
+-- 6
+null :: (Foldable t) => t a -> Bool
+null f = LibraryFunctions.length f == 0
+
+-- 7
+length :: (Foldable t) => t a -> Int
+length = foldr (\_ l -> l + 1) 0
+
+-- 8
+toList :: (Foldable t) => t a -> [a]
+toList = foldr (:) []
+
+-- 9
+-- | Combine the elements of a structure using a monoid.
+--
+fold :: (Foldable t, Monoid m) => t m -> m
+fold = LibraryFunctions.foldMap id
+
+-- 10
+foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
+foldMap f t = foldr (\x m -> mappend (f x) m) mempty t