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..] ```