🎲 probly

Package Version Hex Docs

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
Search Document