🎲 probly
Probabalistic functional programming, without typeclasses
This library is largely influenced by Probabilistic Functional Programming in Haskell by Martin Erwig and Steve Kollmansberger. This implementation adapts the paper’s model to Gleam’s simpler functional interface. See All you need is data and functions.
Usage
gleam add probly
import gleam/float
import gleam/io
import probly
// Define a distribution for a fair coin
pub fn main() {
// A fair 6-sided die
let die = [
#(1, 1.0 /. 6.0),
#(2, 1.0 /. 6.0),
#(3, 1.0 /. 6.0),
#(4, 1.0 /. 6.0),
#(5, 1.0 /. 6.0),
#(6, 1.0 /. 6.0),
]
// Probability that the die shows a 3
let event_3 = fn(x) { x == 3 }
let p_3 = probly.probability_of_event(event_3, die)
io.println("Probability of rolling a 3: " <> float.to_string(p_3))
// Combine two dice
let two_dice = probly.combine_dist(die, die)
// Probability that the sum of the two dice is 7
let sum_is_7 = fn(dice: #(Int, Int)) { dice.0 + dice.1 == 7 }
let p_sum_7 = probly.probability_of_event(sum_is_7, two_dice)
io.println("Probability sum of two dice = 7: " <> float.to_string(p_sum_7))
}
Find more examples in /examples/
, and further documentation at https://hexdocs.pm/probly.
Resources
Martin Erwig and Steve Kollmansberger. 2006. FUNCTIONAL PEARLS: Probabilistic functional programming in Haskell. J. Funct. Program. 16, 1 (January 2006), 21–34. https://doi.org/10.1017/S0956796805005721