[Haskell-cafe] Help on syntactic sugar for combining lazy & strict monads?
Benjamin Redelings
benjamin.redelings at gmail.com
Fri Jul 30 06:35:13 UTC 2021
Hi Olaf,
I think you need to look at two things:
1. The Giry monad, and how it deals with continuous spaces.
2. The paper "Practical Probabilistic Programming with Monads" -
https://doi.org/10.1145/2804302.2804317
Also, observing 2.0 from a continuous distribution is not nonsensical.
-BenRI
On 7/21/21 11:15 PM, Olaf Klinke wrote:
>> However, a lazy interpreter causes problems when trying to introduce
>> *observation* statements (aka conditioning statements) into the monad
>> [3]. For example,
>>
>> run_lazy $ do
>> x <- normal 0 1
>> y <- normal x 1
>> z <- normal y 1
>> 2.0 `observe_from` normal z 1
>> return y
>>
>> In the above code fragment, y will be forced because it is returned, and
>> y will force x. However, the "observe_from" statement will never be
>> forced, because it does not produce a result that is demanded.
>
> I'm very confused. If the observe_from statement is never demanded,
> then what semantics should it have? What is the type of observe_from?
> It seems it is
> a -> m a -> m ()
> for whatever monad m you are using. But conditioning usually is a
> function
> Observation a -> Dist a -> Dist a
> so you must use the result of the conditioning somehow. And isn't the
> principle of Monte Carlo to approximate the posterior by sampling from
> it? I tend to agree with your suggestion that observations and
> sampling can not be mixed (in the same do-notation) but the latter
> have to be collected in a prior, then conditioned by an observation.
>
> What is the semantic connection between your sample and obsersvation
> monad? What is the connection between both and the semantic
> probability distributions? I claim that once you have typed
> everything, it becomes clear where the problem is.
>
> Olaf
>
> P.S. It has always bugged me that probabilists use elements and events
> interchangingly, while this can only be done on discrete spaces. So
> above I would rather like to write
> (2.0==) `observe_from` (normal 0 1)
> which still is a non-sensical statement if (normal 0 1) is a
> continuous distribution where each point set has probability zero.
More information about the Haskell-Cafe
mailing list