<div dir="ltr">On Fri, Nov 20, 2015 at 4:31 AM, Erik Hesselink <span dir="ltr"><<a href="mailto:hesselink@gmail.com" target="_blank">hesselink@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 20 November 2015 at 02:30, Manuel Gómez <<a href="mailto:targen@gmail.com">targen@gmail.com</a>> wrote:<br>
> I haven’t found a helpful example of an Applicative that is not a Monad<br>
> that is practical for a lesson.<br>
<br>
</span>There's ZipList [0], which depending on the type of audience might be<br>
doable. There's also Const [1], but that needs a Monoid constraint,<br>
and since you said you considered ((,) e) as not having an<br>
Applicative, which it does have with a Monoid constraint, perhaps<br>
Const isn't suitable to you for that reason. There are more<br>
interesting examples here [2].<br></blockquote><div><br></div><div>An easy way to find applicative functors that are not monads is through composition. Composing two applicative functors gives a kind of two-stage computation, where the outer functor can affect the inner one, but can’t depend on anything in the inner functor.</div><div><br></div><div>So, Compose (State s) Maybe a = s -> (Maybe a, s) will use state to create a partial value, but whether the final value is Nothing cannot affect the stateful part of the computation. So definitelyFail <*> modifyState will modify the state, even though an earlier part of the computation failed.</div><div><br></div><div>In contrast, MaybeT (State s) a = s -> (Maybe a, s) allows communication between the stages, so returning Nothing will abort the rest of the computation. I.e, definitelyFail <*> modifyState will not modify the state.</div><div><br></div><div>If that’s too confusing for students, an example like IO (Parser a) may be better. This cleanly separates the creation of the parser from its execution, but giving it a monad instance would require giving the IO stage access to the parser’s input and output.</div></div><div><br></div>-- <br><div class="gmail_signature">Dave Menendez <<a href="mailto:dave@zednenem.com" target="_blank">dave@zednenem.com</a>><br><<a href="http://www.eyrie.org/~zednenem/" target="_blank">http://www.eyrie.org/~zednenem/</a>></div>
</div></div>