<div dir="auto"><div>First, for clarity, note that</div><div dir="auto"><br></div><div dir="auto">   const id = flip const</div><div dir="auto"><br></div><div dir="auto">Consider a (right-)occlusive functor. We immediately see that<br></div><div dir="auto"><br></div><div dir="auto">liftA2 (flip const) m (pure x) = pure x</div><div dir="auto"><br></div><div dir="auto">Using the Applicative laws, we can restate this:</div><div dir="auto"><br></div><div dir="auto">x <$ m = pure x</div><div dir="auto"><br></div><div dir="auto">We get the same sort of result for a left-occlusive effect.</div><div dir="auto"><br></div><div dir="auto">So an occlusive effect can't have any *observable* side effects. It must be "read only".</div><div dir="auto"><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Thu, Nov 12, 2020, 3:59 PM Olaf Klinke <<a href="mailto:olf@aatal-apotheke.de">olf@aatal-apotheke.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> First, instead of `const id` I will use `const`, that is, we shall<br>
> prove <br>
> <br>
> const = liftM2 const :: M a -> M b -> M a<br>
> <br>
> which I believe should be equivalent to your property.<br>
<br>
My belief was wrong, which is evident when using do-notation. <br>
Kim-Ee stated<br>
<br>
do {_ <- b; x <- a; return x} = a<br>
<br>
while I examined <br>
<br>
do {x <- a; _ <- b; return x} = a<br>
<br>
Since do {x <- a; return x} = a holds for any monad, Kim-Ee's property<br>
can be reduced to <br>
<br>
do {_ <- b; a} = a<br>
or more concisely <br>
b >> a = a<br>
<br>
which I called Kleisli-const in my previous post. As we seemed to have<br>
settled for "occlusive" I suggest calling <br>
b >> a = a<br>
"right-occlusive" or "occlusive from the right" because the right<br>
action occludes the side-effects of the left action, and <br>
do {x <- a; _ <- b; return x} = a<br>
should be called "left-occlusive" or "occlusive from the left" because<br>
the left action hides the effect of the right action. Under<br>
commutativity, both are the same but in general these might be<br>
different properties. I do not have a distinguishing counterexample,<br>
though, because all monads I come up with are commutative. <br>
<br>
David Feuer hinted at the possibility to define occlusiveness more<br>
generally for Applicative functors. Commutativity might be stated for<br>
Applicatives as <br>
<br>
liftA2 f a b = liftA2 (flip f) b a<br>
<br>
So far I can only see two classes of occlusive monads: The reader-like<br>
(Identity ~ Reader ()) and the set-like monads. <br>
<br>
Olaf<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div></div></div>