Copyright | (c) Artem Chirkin |
---|---|
License | BSD3 |
Maintainer | chirkin@arch.ethz.ch |
Safe Haskell | None |
Language | Haskell2010 |
This module defines a set of tuple data types to substitute normal Haskell tuples.
The reason is that Monoid
instances of normal tuples are lazy,
which makes folds with arithmetic operations leak memory.
Semigroup
and Monoid
instances of tuples in this module are strict in all their arguments.
Using tuple types defined here together with Numeric.Semigroup.foldMap'
,
one can combine multiple monoidal fold structures in a single pass over a foldable container:
> foldMap' (T3 <$> Max <*> Sum <*> Min) $ take 100000000 ([1..] :: [Int])
The example above runs in constant space, which would not happen with normal
GHC tuples due to strictness properties of their mappend
implementations
(tuple arguments are not enforced).
- data T0 = T0
- newtype T1 a = T1 a
- data T2 a b = T2 a b
- data T3 a b c = T3 a b c
- data T4 a b c d = T4 a b c d
- data T5 a b c d e = T5 a b c d e
- data T6 a b c d e f = T6 a b c d e f
- data T7 a b c d e f g = T7 a b c d e f g
- data T8 a b c d e f g h = T8 a b c d e f g h
- data T9 a b c d e f g h i = T9 a b c d e f g h i
- class AsTuple a b | a -> b, b -> a where
- foldMap' :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
Documentation
T1 a |
Monad T1 Source # | |
Functor T1 Source # | |
Applicative T1 Source # | |
Foldable T1 Source # | |
Traversable T1 Source # | |
Generic1 T1 Source # | |
Bounded a => Bounded (T1 a) Source # | |
Eq a => Eq (T1 a) Source # | |
Data a => Data (T1 a) Source # | |
Ord a => Ord (T1 a) Source # | |
Read a => Read (T1 a) Source # | |
Show a => Show (T1 a) Source # | |
Generic (T1 a) Source # | |
Semigroup a => Semigroup (T1 a) Source # | |
Monoid a => Monoid (T1 a) Source # | |
type Rep1 T1 Source # | |
type Rep (T1 a) Source # | |
T2 a b |
Bifunctor T2 Source # | |
Monoid a => Monad (T2 a) Source # | |
Functor (T2 a) Source # | |
Monoid a => Applicative (T2 a) Source # | |
Foldable (T2 a) Source # | |
Traversable (T2 a) Source # | |
Generic1 (T2 a) Source # | |
(Bounded a, Bounded b) => Bounded (T2 a b) Source # | |
(Eq b, Eq a) => Eq (T2 a b) Source # | |
(Data b, Data a) => Data (T2 a b) Source # | |
(Ord b, Ord a) => Ord (T2 a b) Source # | |
(Read b, Read a) => Read (T2 a b) Source # | |
(Show b, Show a) => Show (T2 a b) Source # | |
Generic (T2 a b) Source # | |
(Semigroup a, Semigroup b) => Semigroup (T2 a b) Source # | |
(Monoid a, Monoid b) => Monoid (T2 a b) Source # | |
AsTuple (a, b) (T2 a b) Source # | |
type Rep1 (T2 a) Source # | |
type Rep (T2 a b) Source # | |
T3 a b c |
Bifunctor (T3 a) Source # | |
(Monoid a, Monoid b) => Monad (T3 a b) Source # | |
Functor (T3 a b) Source # | |
(Monoid a, Monoid b) => Applicative (T3 a b) Source # | |
Foldable (T3 a b) Source # | |
Traversable (T3 a b) Source # | |
Generic1 (T3 a b) Source # | |
(Bounded a, Bounded b, Bounded c) => Bounded (T3 a b c) Source # | |
(Eq c, Eq b, Eq a) => Eq (T3 a b c) Source # | |
(Data c, Data b, Data a) => Data (T3 a b c) Source # | |
(Ord c, Ord b, Ord a) => Ord (T3 a b c) Source # | |
(Read c, Read b, Read a) => Read (T3 a b c) Source # | |
(Show c, Show b, Show a) => Show (T3 a b c) Source # | |
Generic (T3 a b c) Source # | |
(Semigroup a, Semigroup b, Semigroup c) => Semigroup (T3 a b c) Source # | |
(Monoid a, Monoid b, Monoid c) => Monoid (T3 a b c) Source # | |
AsTuple (a, b, c) (T3 a b c) Source # | |
type Rep1 (T3 a b) Source # | |
type Rep (T3 a b c) Source # | |
T4 a b c d |
Bifunctor (T4 a b) Source # | |
(Monoid a, Monoid b, Monoid c) => Monad (T4 a b c) Source # | |
Functor (T4 a b c) Source # | |
(Monoid a, Monoid b, Monoid c) => Applicative (T4 a b c) Source # | |
Foldable (T4 a b c) Source # | |
Traversable (T4 a b c) Source # | |
Generic1 (T4 a b c) Source # | |
(Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (T4 a b c d) Source # | |
(Eq d, Eq c, Eq b, Eq a) => Eq (T4 a b c d) Source # | |
(Data d, Data c, Data b, Data a) => Data (T4 a b c d) Source # | |
(Ord d, Ord c, Ord b, Ord a) => Ord (T4 a b c d) Source # | |
(Read d, Read c, Read b, Read a) => Read (T4 a b c d) Source # | |
(Show d, Show c, Show b, Show a) => Show (T4 a b c d) Source # | |
Generic (T4 a b c d) Source # | |
(Semigroup a, Semigroup b, Semigroup c, Semigroup d) => Semigroup (T4 a b c d) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (T4 a b c d) Source # | |
AsTuple (a, b, c, d) (T4 a b c d) Source # | |
type Rep1 (T4 a b c) Source # | |
type Rep (T4 a b c d) Source # | |
T5 a b c d e |
Bifunctor (T5 a b c) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d) => Monad (T5 a b c d) Source # | |
Functor (T5 a b c d) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d) => Applicative (T5 a b c d) Source # | |
Foldable (T5 a b c e) Source # | |
Traversable (T5 a b c d) Source # | |
Generic1 (T5 a b c d) Source # | |
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e) => Bounded (T5 a b c d e) Source # | |
(Eq e, Eq d, Eq c, Eq b, Eq a) => Eq (T5 a b c d e) Source # | |
(Data e, Data d, Data c, Data b, Data a) => Data (T5 a b c d e) Source # | |
(Ord e, Ord d, Ord c, Ord b, Ord a) => Ord (T5 a b c d e) Source # | |
(Read e, Read d, Read c, Read b, Read a) => Read (T5 a b c d e) Source # | |
(Show e, Show d, Show c, Show b, Show a) => Show (T5 a b c d e) Source # | |
Generic (T5 a b c d e) Source # | |
(Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e) => Semigroup (T5 a b c d e) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) => Monoid (T5 a b c d e) Source # | |
AsTuple (a, b, c, d, e) (T5 a b c d e) Source # | |
type Rep1 (T5 a b c d) Source # | |
type Rep (T5 a b c d e) Source # | |
T6 a b c d e f |
Bifunctor (T6 a b c d) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) => Monad (T6 a b c d e) Source # | |
Functor (T6 a b c d e) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) => Applicative (T6 a b c d e) Source # | |
Foldable (T6 a b c d e) Source # | |
Traversable (T6 a b c d e) Source # | |
Generic1 (T6 a b c d e) Source # | |
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f) => Bounded (T6 a b c d e f) Source # | |
(Eq f, Eq e, Eq d, Eq c, Eq b, Eq a) => Eq (T6 a b c d e f) Source # | |
(Data f, Data e, Data d, Data c, Data b, Data a) => Data (T6 a b c d e f) Source # | |
(Ord f, Ord e, Ord d, Ord c, Ord b, Ord a) => Ord (T6 a b c d e f) Source # | |
(Read f, Read e, Read d, Read c, Read b, Read a) => Read (T6 a b c d e f) Source # | |
(Show f, Show e, Show d, Show c, Show b, Show a) => Show (T6 a b c d e f) Source # | |
Generic (T6 a b c d e f) Source # | |
(Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e, Semigroup f) => Semigroup (T6 a b c d e f) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f) => Monoid (T6 a b c d e f) Source # | |
AsTuple (a, b, c, d, e, f) (T6 a b c d e f) Source # | |
type Rep1 (T6 a b c d e) Source # | |
type Rep (T6 a b c d e f) Source # | |
data T7 a b c d e f g Source #
T7 a b c d e f g |
Bifunctor (T7 a b c d e) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f) => Monad (T7 a b c d e f) Source # | |
Functor (T7 a b c d e f) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f) => Applicative (T7 a b c d e f) Source # | |
Foldable (T7 a b c d e f) Source # | |
Traversable (T7 a b c d e f) Source # | |
Generic1 (T7 a b c d e f) Source # | |
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g) => Bounded (T7 a b c d e f g) Source # | |
(Eq g, Eq f, Eq e, Eq d, Eq c, Eq b, Eq a) => Eq (T7 a b c d e f g) Source # | |
(Data g, Data f, Data e, Data d, Data c, Data b, Data a) => Data (T7 a b c d e f g) Source # | |
(Ord g, Ord f, Ord e, Ord d, Ord c, Ord b, Ord a) => Ord (T7 a b c d e f g) Source # | |
(Read g, Read f, Read e, Read d, Read c, Read b, Read a) => Read (T7 a b c d e f g) Source # | |
(Show g, Show f, Show e, Show d, Show c, Show b, Show a) => Show (T7 a b c d e f g) Source # | |
Generic (T7 a b c d e f g) Source # | |
(Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e, Semigroup f, Semigroup g) => Semigroup (T7 a b c d e f g) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g) => Monoid (T7 a b c d e f g) Source # | |
AsTuple (a, b, c, d, e, f, g) (T7 a b c d e f g) Source # | |
type Rep1 (T7 a b c d e f) Source # | |
type Rep (T7 a b c d e f g) Source # | |
data T8 a b c d e f g h Source #
T8 a b c d e f g h |
Bifunctor (T8 a b c d e f) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g) => Monad (T8 a b c d e f g) Source # | |
Functor (T8 a b c d e f g) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g) => Applicative (T8 a b c d e f g) Source # | |
Foldable (T8 a b c d e f g) Source # | |
Traversable (T8 a b c d e f g) Source # | |
Generic1 (T8 a b c d e f g) Source # | |
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h) => Bounded (T8 a b c d e f g h) Source # | |
(Eq h, Eq g, Eq f, Eq e, Eq d, Eq c, Eq b, Eq a) => Eq (T8 a b c d e f g h) Source # | |
(Data h, Data g, Data f, Data e, Data d, Data c, Data b, Data a) => Data (T8 a b c d e f g h) Source # | |
(Ord h, Ord g, Ord f, Ord e, Ord d, Ord c, Ord b, Ord a) => Ord (T8 a b c d e f g h) Source # | |
(Read h, Read g, Read f, Read e, Read d, Read c, Read b, Read a) => Read (T8 a b c d e f g h) Source # | |
(Show h, Show g, Show f, Show e, Show d, Show c, Show b, Show a) => Show (T8 a b c d e f g h) Source # | |
Generic (T8 a b c d e f g h) Source # | |
(Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e, Semigroup f, Semigroup g, Semigroup h) => Semigroup (T8 a b c d e f g h) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g, Monoid h) => Monoid (T8 a b c d e f g h) Source # | |
AsTuple (a, b, c, d, e, f, g, h) (T8 a b c d e f g h) Source # | |
type Rep1 (T8 a b c d e f g) Source # | |
type Rep (T8 a b c d e f g h) Source # | |
data T9 a b c d e f g h i Source #
T9 a b c d e f g h i |
Bifunctor (T9 a b c d e f g) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g, Monoid h) => Monad (T9 a b c d e f g h) Source # | |
Functor (T9 a b c d e f g h) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g, Monoid h) => Applicative (T9 a b c d e f g h) Source # | |
Foldable (T9 a b c d e f g h) Source # | |
Traversable (T9 a b c d e f g h) Source # | |
Generic1 (T9 a b c d e f g h) Source # | |
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h, Bounded i) => Bounded (T9 a b c d e f g h i) Source # | |
(Eq i, Eq h, Eq g, Eq f, Eq e, Eq d, Eq c, Eq b, Eq a) => Eq (T9 a b c d e f g h i) Source # | |
(Data i, Data h, Data g, Data f, Data e, Data d, Data c, Data b, Data a) => Data (T9 a b c d e f g h i) Source # | |
(Ord i, Ord h, Ord g, Ord f, Ord e, Ord d, Ord c, Ord b, Ord a) => Ord (T9 a b c d e f g h i) Source # | |
(Read i, Read h, Read g, Read f, Read e, Read d, Read c, Read b, Read a) => Read (T9 a b c d e f g h i) Source # | |
(Show i, Show h, Show g, Show f, Show e, Show d, Show c, Show b, Show a) => Show (T9 a b c d e f g h i) Source # | |
Generic (T9 a b c d e f g h i) Source # | |
(Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e, Semigroup f, Semigroup g, Semigroup h, Semigroup i) => Semigroup (T9 a b c d e f g h i) Source # | |
(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g, Monoid h, Monoid i) => Monoid (T9 a b c d e f g h i) Source # | |
AsTuple (a, b, c, d, e, f, g, h, i) (T9 a b c d e f g h i) Source # | |
type Rep1 (T9 a b c d e f g h) Source # | |
type Rep (T9 a b c d e f g h i) Source # | |
class AsTuple a b | a -> b, b -> a where Source #
AsTuple () T0 Source # | |
AsTuple (a, b) (T2 a b) Source # | |
AsTuple (a, b, c) (T3 a b c) Source # | |
AsTuple (a, b, c, d) (T4 a b c d) Source # | |
AsTuple (a, b, c, d, e) (T5 a b c d e) Source # | |
AsTuple (a, b, c, d, e, f) (T6 a b c d e f) Source # | |
AsTuple (a, b, c, d, e, f, g) (T7 a b c d e f g) Source # | |
AsTuple (a, b, c, d, e, f, g, h) (T8 a b c d e f g h) Source # | |
AsTuple (a, b, c, d, e, f, g, h, i) (T9 a b c d e f g h i) Source # | |
foldMap' :: (Foldable t, Monoid m) => (a -> m) -> t a -> m Source #
Map each element of the structure to a monoid, and combine the results.
This function differs from Data.Foldable.foldMap
in that uses foldl'
instead of foldr
inside.
This makes this function suitable for Monoids with strict mappend
operation.
For example,
foldMap' Sum $ take 1000000000 ([1..] :: [Int])
runs in constant memory, whereas normal foldMap
would cause a memory leak there.