We benchmark the performance of the `applyMerge` implementations on different
"shapes" of generated elements.
* Linear: `applyMerge const [1..] [1..]`
Shape
. . . . . . . . . . . . . . .
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* Double linear: `applyMerge min [1..] [1..]`
Shape
. . . . . . . . . . . . . . .
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
* Box: `applyMerge max [1..] [1..]`
Shape
. . . . . . . * * * * * * * *
. . . . . . . * * * * * * * *
. . . . . . . * * * * * * * *
. . . . . . . * * * * * * * *
. . . . . . . * * * * * * * *
. . . . . . . * * * * * * * *
. . . . . . . * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* Triangular `applyMerge (+) [1..] [1..]`
Shape
. . . . . . . . . . . . . . *
. . . . . . . . . . . . . * *
. . . . . . . . . . . . * * *
. . . . . . . . . . . * * * *
. . . . . . . . . . * * * * *
. . . . . . . . . * * * * * *
. . . . . . . . * * * * * * *
. . . . . . . * * * * * * * *
. . . . . . . * * * * * * * *
. . . . . . * * * * * * * * *
. . . . . * * * * * * * * * *
. . . . * * * * * * * * * * *
. . . * * * * * * * * * * * *
. . * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
* Skewed triangular `applyMerge (\x y -> 4 * x + y) [1..] [1..]`
Shape
. . . . . . . . . . . . . . *
. . . . . . . . . . * * * * *
. . . . . . * * * * * * * * *
. . * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* Hyperbolic: `applyMerge (*) [1..] [1..]`
Shape
. . . . . . . . . . . . . . .
. . . . . . . * * * * * * * *
. . . . . * * * * * * * * * *
. . . * * * * * * * * * * * *
. . . * * * * * * * * * * * *
. . * * * * * * * * * * * * *
. . * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
* Skewed hyperbolic `applyMerge (\x y -> x^3 * y) [1..]`
Shape
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . * * * * * *
. . . * * * * * * * * * * * *
. . * * * * * * * * * * * * *
. * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* Circular: `applyMerge (\x y -> x*x + y*y) [1..]`
Shape
. . . . . . . . . . . . . * *
. . . . . . . . . . . . . * *
. . . . . . . . . . . . . * *
. . . . . . . . . . . . . * *
. . . . . . . . . . . . * * *
. . . . . . . . . . . . * * *
. . . . . . . . . . . * * * *
. . . . . . . . . . . * * * *
. . . . . . . . . . * * * * *
. . . . . . . . . * * * * * *
. . . . . . . . * * * * * * *
. . . . . . * * * * * * * * *
. . . . * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* Elliptical: `applyMerge (\x y -> 4*x*x + y*y) [1..]`
Shape
. . . . . . . . . . . . . . *
. . . . . . . . . . . . . * *
. . . . . . . . . . . . . * *
. . . . . . . . . . . . * * *
. . . . . . . . . . * * * * *
. . . . . . . * * * * * * * *
. . . * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* Composites:
We can generate prime numbers using the Sieve of Erastosthenes:
````haskell
primes :: [Int]
primes = 2 : ([3..] `minus` composites) -- `minus` from data-ordlist
composites :: [Int]
composites = applyMerge (\p i -> p * (p + i)) primes [0..]
````
The shape of `composites` then looks like:
Shape
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . * * * *
. . . . * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
Since the *n*th prime number is approximately *n* log *n*, this is a
quasi-hyperbolic shape, roughly equivalent to
```haskell
f :: Int -> Int -> Double
f x y =
let x' :: Double
x' = fromIntegral x
y' :: Double
y' = fromIntegral y
xlogx :: Double
xlogx = x' * log x'
in xlogx * (xlogx + y')
compositesApprox :: [Double]
compositesApprox = applyMerge f [1..] [1..]
```