Advances in inference algorithms and probability theory have spurred recent interest in probabilistic programming. However, it is still not clear which design leads to the maximal flexibility in terms of exploiting probabilistic inference. In this talk, I will motivate the need for and potential of probabilistic programming and describe some of the limitations of current approaches. The central claim of the talk is that combining functional and probabilistic programming, and in particular exploiting the fact that probability distributions are monads, leads to a very expressive language for probabilistic models. I will define the handful of operators that need to be added to a purely functional programming language in order to achieve practically useful Bayesian inference and allow flexible post-inference computations. Adding a differential operator extends the paradigm to inference in models based on ordinary and stochastic differential equations. Static types can then introduce new guarantees about the propagation and maintenance of uncertainty. Finally, I will show how this core computational platform can be integrated with more traditional computer applications.