// Run sequentially if we're not using a parallel interpreter
        public X Run <X>(DistInterpreter <A, X> interpreter)
        {
            var resultA = from x in first
                          from y in second
                          from result in run(x, y)
                          select result;

            return(resultA.Run(interpreter));
        }
 public X Run <X>(DistInterpreter <A, X> interpreter)
 {
     return(interpreter.Primitive(dist));
 }
 public X Run <X>(DistInterpreter <A, X> interpreter)
 {
     return(interpreter.Pure(Value));
 }
 public X Run <X>(DistInterpreter <A, X> interpreter)
 {
     return(interpreter.Bind(dist, bind));
 }
 // Run sequentially if we're not using a parallel interpreter
 public X Run <X>(DistInterpreter <Dist <A>, X> interpreter)
 {
     return(Return(dist).Run(interpreter));
 }
 public X Run <X>(DistInterpreter <A, X> interpreter)
 {
     return(interpreter.Conditional(likelihood, dist));
 }