Distribution Module
Probability distributions with sampling, PDF/CDF, and statistical moments.
The Distribution module provides 12 probability distributions with comprehensive statistical functions including sampling (reproducible and non-reproducible), probability density/mass functions, cumulative distribution functions, quantiles, and moments (mean, variance, skewness).
Distributions
- Continuous: Normal, Uniform, Exponential, Gamma, Beta, ChiSquared, StudentT, Weibull, LogNormal
- Discrete: Poisson, Bernoulli, Binomial
Common patterns
import Distribution
import Result
-- Create and sample from a normal distribution
let normal = Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
let samples = Distribution.sampleN 100 normal
let reproducible = Distribution.sampleSeeded 42 normal
-- Probability calculations
Distribution.pdf 0.0 normal -- ~0.3989
Distribution.cdf 1.96 normal -- ~0.975
-- Statistical moments
Distribution.mean normal -- 0.0
Distribution.variance normal -- 1.0
Return types
Constructor functions return Result Distribution String to validate parameters:
normal 0.0 (-1.0)returnsErr "Standard deviation must be positive"
Sampling returns Int for discrete distributions, Float for continuous.
Functions
Constructors
Distribution.normal
Float -> Float -> Result Distribution String
Create a normal (Gaussian) distribution with given mean and standard deviation.
import Distribution
Distribution.normal 0.0 1.0Try itNotes: Standard deviation must be positive.
See also: Distribution.sample, Distribution.pdf
Distribution.uniform
Float -> Float -> Result Distribution String
Create a uniform distribution over the interval [min, max).
import Distribution
Distribution.uniform 0.0 10.0Try itNotes: Minimum must be less than maximum.
See also: Distribution.normal
Distribution.exponential
Float -> Result Distribution String
Create an exponential distribution with given rate parameter.
import Distribution
Distribution.exponential 0.5Try itNotes: Rate must be positive.
See also: Distribution.gamma
Distribution.poisson
Float -> Result Distribution String
Create a Poisson distribution with given lambda (rate) parameter.
import Distribution
Distribution.poisson 5.0Try itNotes: Lambda must be positive. This is a discrete distribution.
See also: Distribution.binomial
Distribution.bernoulli
Float -> Result Distribution String
Create a Bernoulli distribution with given probability of success.
import Distribution
Distribution.bernoulli 0.5Try itNotes: Probability must be between 0 and 1. Samples return 0 or 1.
See also: Distribution.binomial
Distribution.binomial
Int -> Float -> Result Distribution String
Create a binomial distribution with n trials and probability p of success.
import Distribution
Distribution.binomial 10 0.5Try itNotes: n must be non-negative, p must be between 0 and 1.
See also: Distribution.bernoulli
Distribution.gamma
Float -> Float -> Result Distribution String
Create a gamma distribution with given shape and rate parameters.
import Distribution
Distribution.gamma 2.0 1.0Try itNotes: Shape and rate must be positive.
See also: Distribution.exponential, Distribution.chiSquared
Distribution.beta
Float -> Float -> Result Distribution String
Create a beta distribution with given alpha and beta shape parameters.
import Distribution
Distribution.beta 2.0 5.0Try itNotes: Alpha and beta must be positive.
See also: Distribution.uniform
Distribution.chiSquared
Float -> Result Distribution String
Create a chi-squared distribution with k degrees of freedom.
import Distribution
Distribution.chiSquared 3.0Try itNotes: Degrees of freedom must be positive.
See also: Distribution.gamma
Distribution.studentT
Float -> Result Distribution String
Create a Student's t-distribution with given degrees of freedom (standard form: mean=0, scale=1).
import Distribution
Distribution.studentT 10.0Try itNotes: Degrees of freedom must be positive.
See also: Distribution.normal
Distribution.weibull
Float -> Float -> Result Distribution String
Create a Weibull distribution with given shape and scale parameters.
import Distribution
Distribution.weibull 1.5 2.0Try itNotes: Shape and scale must be positive.
See also: Distribution.exponential
Distribution.logNormal
Float -> Float -> Result Distribution String
Create a log-normal distribution with given mu and sigma (parameters of the underlying normal).
import Distribution
Distribution.logNormal 0.0 1.0Try itNotes: Sigma must be positive.
See also: Distribution.normal
Sampling
Distribution.sample
Distribution -> number
Draw one random sample from the distribution. Returns Int for discrete distributions, Float for continuous.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.sampleTry itNotes: Uses thread-local RNG. For reproducible results, use sampleSeeded.
See also: Distribution.sampleSeeded, Distribution.sampleN
Distribution.sampleSeeded
Int -> Distribution -> number
Draw one sample using a specific seed for reproducibility.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.sampleSeeded 42Try itNotes: Same seed always produces same result.
See also: Distribution.sample, Distribution.sampleNSeeded
Distribution.sampleN
Int -> Distribution -> [number]
Draw n random samples from the distribution.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.sampleN 100Try itNotes: Uses thread-local RNG.
See also: Distribution.sample, Distribution.sampleNSeeded
Distribution.sampleNSeeded
Int -> Int -> Distribution -> [number]
Draw n samples using a specific seed for reproducibility.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.sampleNSeeded 42 100Try itNotes: Arguments are: seed, count, distribution.
See also: Distribution.sampleN, Distribution.sampleSeeded
Probability
Distribution.pdf
Float -> Distribution -> Float
Probability density function. For discrete distributions, returns PMF at integer points, 0 otherwise.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.pdf 0.0
-- ~0.3989Try itSee also: Distribution.cdf, Distribution.pmf
Distribution.pmf
Int -> Distribution -> Float
Probability mass function for discrete distributions (Poisson, Bernoulli, Binomial).
import Distribution
Distribution.poisson 5.0
|> Result.withDefault (panic "invalid")
|> Distribution.pmf 5Try itNotes: Only works for discrete distributions.
See also: Distribution.pdf
Distribution.cdf
Float -> Distribution -> Float
Cumulative distribution function: P(X <= x).
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.cdf 1.96
-- ~0.975Try itSee also: Distribution.quantile, Distribution.pdf
Distribution.quantile
Float -> Distribution -> Result Float String
Inverse CDF: returns x such that P(X <= x) = p. Only for continuous distributions.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.quantile 0.975
-- Ok ~1.96Try itNotes: Probability must be strictly between 0 and 1.
See also: Distribution.cdf
Distribution.logPdf
Float -> Distribution -> Float
Log of the probability density function. More numerically stable for extreme values.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.logPdf 0.0Try itSee also: Distribution.pdf
Moments
Distribution.mean
Distribution -> Float
Expected value (first moment) of the distribution.
import Distribution
Distribution.normal 5.0 2.0
|> Result.withDefault (panic "invalid")
|> Distribution.mean
-- 5.0Try itSee also: Distribution.variance, Distribution.stdDev
Distribution.variance
Distribution -> Float
Variance (second central moment) of the distribution.
import Distribution
Distribution.normal 0.0 2.0
|> Result.withDefault (panic "invalid")
|> Distribution.variance
-- 4.0Try itSee also: Distribution.mean, Distribution.stdDev
Distribution.stdDev
Distribution -> Float
Standard deviation (square root of variance).
import Distribution
Distribution.normal 0.0 2.0
|> Result.withDefault (panic "invalid")
|> Distribution.stdDev
-- 2.0Try itSee also: Distribution.variance
Distribution.skewness
Distribution -> Maybe Float
Skewness (third standardized moment). Returns Nothing if undefined.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.skewness
-- Just 0.0Try itSee also: Distribution.kurtosis
Distribution.kurtosis
Distribution -> Maybe Float
Excess kurtosis (fourth standardized moment - 3). Returns Nothing if undefined.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.kurtosisTry itNotes: Currently returns Nothing for all distributions.
See also: Distribution.skewness
Inspection
Distribution.min
Distribution -> Float
Lower bound of the distribution's support.
import Distribution
Distribution.uniform 5.0 10.0
|> Result.withDefault (panic "invalid")
|> Distribution.min
-- 5.0Try itNotes: Returns negative infinity for unbounded distributions.
See also: Distribution.max
Distribution.max
Distribution -> Float
Upper bound of the distribution's support.
import Distribution
Distribution.uniform 5.0 10.0
|> Result.withDefault (panic "invalid")
|> Distribution.max
-- 10.0Try itNotes: Returns positive infinity for unbounded distributions.
See also: Distribution.min
Distribution.isDiscrete
Distribution -> Bool
Returns True if the distribution is discrete (Poisson, Bernoulli, Binomial).
import Distribution
Distribution.poisson 5.0
|> Result.withDefault (panic "invalid")
|> Distribution.isDiscrete
-- TrueTry itSee also: Distribution.isContinuous
Distribution.isContinuous
Distribution -> Bool
Returns True if the distribution is continuous.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.isContinuous
-- TrueTry itSee also: Distribution.isDiscrete
Distribution.name
Distribution -> String
Returns the name of the distribution type.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.name
-- "Normal"Try itSee also: Distribution.parameters
Distribution.parameters
Distribution -> [(String, Float)]
Returns the parameters of the distribution as a list of (name, value) tuples.
import Distribution
Distribution.normal 0.0 1.0
|> Result.withDefault (panic "invalid")
|> Distribution.parameters
-- [("mean", 0.0), ("stdDev", 1.0)]Try itSee also: Distribution.name