<div dir="ltr">On Tue, Jan 31, 2017 at 11:55 PM, Joachim Breitner <span dir="ltr"><<a href="mailto:mail@joachim-breitner.de" target="_blank">mail@joachim-breitner.de</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi,<br>
<span class="gmail-"><br>
Am Dienstag, den 31.01.2017, 15:22 -0500 schrieb Joachim Breitner:<br>
> I recently wrote this applicative functor:<br>
><br>
>     data OneStep a = OneStep a [a]<br>
><br>
>     instance Functor OneStep where<br>
>         fmap f (OneStep o s) = OneStep (f o) (map f s)<br>
><br>
>     instance Applicative OneStep where<br>
>         pure x = OneStep x []<br>
>         OneStep f fs <*> OneStep x xs = OneStep (f x) (map ($x) fs ++<br>
> map f xs)<br>
><br>
>     takeOneStep :: OneStep t -> [t]<br>
>     takeOneStep (OneStep _ xs) = xs<br>
><br>
> This was useful in the context of writing a shrink for QuickCheck, as<br>
> discussed at <a href="http://stackoverflow.com/a/41944525/946226" rel="noreferrer" target="_blank">http://stackoverflow.com/a/<wbr>41944525/946226</a>.<br>
><br>
> Now I wonder: Does this functor have a proper name? Does it already<br>
> exist in the libraries somewhere? Should it?<br>
<br>
</span>I guess it does not exist, so I am preparing a package for it here:<br>
<a href="https://github.com/nomeata/haskell-successors" rel="noreferrer" target="_blank">https://github.com/nomeata/<wbr>haskell-successors</a><br>
<br>
The source code contains (in comments) a proof of the Applicative laws.<br>
<br>
My gut feeling says that this does not have a Monad instance that is<br>
compatible with the given Applicative instance, but it is too late<br>
today to substantiate this feeling. If anyone feels like puzzling: Can<br>
you come up with a Monad instance, or (more likely) give good reasons<br>
why there cannot be one?</blockquote></div><div><br></div><div>How about this?</div><div><br></div><div>hd (OneStep x xs) = x</div><div><br></div><div><div>instance Monad OneStep where</div><div>    OneStep x xs >>= f = OneStep y (map (hd . f) xs ++ ys)</div><div>        where</div><div>        OneStep y ys = f x</div></div><div><br></div><div>Not sure if it’s good for anything, but it seems valid and consistent based on a preliminary investigation.</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>