Hakaru: An embedded probabilistic programming language in Haskell
indiana.edu
indiana.edu
This is in contrast to something like PyMC where random variables are very much special objects that interacted with, and making nonparametric models is trickier.
Like PyMC, Figaro, Infer.NET and Factorie but unlike OpenBUGS this is a library so it is easier to use a larger prediction application. We don't support some of the optimizations that OpenBUGS can do when presented with a model.
As another note, this is a fairly new piece of code. Unlike PyMC, BLOG, Stan, and other probabilistic programming systems we only support Importance Sampling and a fairly naive version of Metropolis Hastings. This is in contrast to many of the existing solutions where you can do things like Particle MCMC and Hamiltonian Monte Carlo. We do intend to eventually support these inference techniques.
What is the nicer way to do it?
As an example, suppose I am trying to load a csv file with two fields being strings and one being Double. A list of lists representation isn't going to cut it. Instead I should make a Row datatype
data Row = Row {field1 :: String, field2 :: String, field3 :: Double}
Then you can parse the csv file into a [Row] representation.As an aside, if the task did involve parsing csv I suggest the cassava library which I found out about through the amazing What I Wish I Knew When Learning Haskell (http://dev.stephendiehl.com/hask/)
data Datum = S String | D Double
lst :: [Datum]
lst = [S "a", D 3.14]
In Python we'd have to write the logic to handle both cases and fail with an exception or do an instanceof check. In Haskell we'd do this by pattern matching on the sum type. case (lst !! 42) of
S n -> -- handle string
D n -> -- handle numberIt really is a very simple language. The ML languages (and Haskell in particular) are just rather different and initially hard to read.
I think you'll face a similar problem with Clojure :)
x := 1
while (x < 100)
stuff(x)
x := x + 1
etc, etc. Typical Haskell doesn't look like this. The example didn't look like this. Clojure won't look like this, either (in fact, it's likely to look even weirder than the Haskell example). That's neither good nor bad; I don't think programming languages should be judged by how much they resemble C/Pascal/Python/pseudocode.http://blog.ezyang.com/2011/11/how-to-read-haskell/
The things that make haskell and ocaml outwardly different are the pattern match syntax for function definitions, type signatures, the IO monad's slightly different syntax, all the category theory structures and their punctuation filled names, "<*>", and, you know, all that "theorems for free" and Curry-Howard stuff. But to get started, there's LYAH and (3)good tutorial books by Alejandro Mena, Simon Thompson and Graham Hutton, you can type expressions in to GHCi (the REPL) and see what types GHC infers, and you can, uh, encounter GHC error messages and warnings for the firs ttime.