In probabilistic programming, we use a a lot of distributions. In some settings, it’s important for it to be very easy to define new distributions, and to reason about them.
The current type of a Distribution
or Sampleable
is
help?> Sampleable
search: Sampleable
Sampleable{F<:VariateForm,S<:ValueSupport}
Sampleable is any type able to produce random values. Parametrized by a
VariateForm defining the dimension of samples and a ValueSupport defining the
domain of possibly sampled values. Any Sampleable implements the Base.rand
method.
First we have to say whether a returned value is Univariate
, Multivariate
, or Matrixvariate
. Then we have to say whether it’s Discrete
or Continuous
.
But all of this information is available from the type of the result. Why not just Sampleable{T}
? Then…

sample(::Sampleable{T})
returns a value of typeT

Sampleable{Int}
is clearly univariate discrete 
Sampleable{Vector{Float}}
is multivariate continuous
In the current setup, say I want a distribution over trees. Then I have to define a new Treevariate
type, and decide whether my trees will be continuous or discrete, or what that even means. Sampleable{Tree{MoreParams}}
would do this just fine.
In practice, the heavy weight of implementing all of this often leads me to sidestep Distributions entirely. For example, in Soss I have an EqualMix
combinator that gives a mixture model with equalweight components. I define it as
struct EqualMix{T}
components::Vector{T}
end
and add some methods, and it works just fine. If I could tell it T
should be a Distribution, that would be better. But the current setup doesn’t seem to me to map well to the domain.
Am I missing something? What’s the big benefit of the current approach?