<div dir="ltr">On Sun, Dec 4, 2016 at 12:44 AM, David Feuer <span dir="ltr"><<a href="mailto:david.feuer@gmail.com" target="_blank">david.feuer@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"><div dir="auto"><span class=""><div>On Dec 4, 2016 12:22 AM, "David Menendez" <<a href="mailto:dave@zednenem.com" target="_blank">dave@zednenem.com</a>> wrote:</div><div dir="auto"><div class="gmail_extra" dir="auto"><div class="gmail_quote"><blockquote class="m_8036146507775529570m_1808800202460114346quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div class="m_8036146507775529570m_1808800202460114346quoted-text"><div><br></div></div><div>You can also use it with contra-variant or invariant type constructors, e.g.,</div><div><br></div><div>instance Siftable a (a -> Bool) where</div><div>    sift f g = \x -> f x && g x</div></div></div></div></blockquote></div></div></div><div dir="auto"><br></div></span><div dir="auto">That looks backwards for your composition law, but I'm a bit tired so I wouldn't swear to it.</div></div></blockquote><div><br></div><div>You’re right. Of course, they’re all the same if we assume total functions.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div dir="auto">Surely you can do the same with the constructor class.</div><div dir="auto"><br></div><div dir="auto">newtype Ab a = Ab (a -> Bool)</div><div dir="auto">instance Siftable Ab where</div><div dir="auto">  siftAway _ = Ab (const False)</div><div dir="auto">  sift p (Ab g) = Ab ...</div></div></blockquote><div><br></div><div>Ab is contravariant, so you would need something like</div><div><br></div><div>siftContraMap :: (a -> Maybe b) -> f b -> f a</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div dir="auto"></div><div dir="auto">I'm not sure if my siftAway excludes anything it shouldn't....</div><div dir="auto"></div></div>
</blockquote></div><div class="gmail_extra"><br></div>I’m not sure it’s possible to define siftAway so that it isn’t equal to sift (const Nothing).<br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="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>