<div dir="auto"><div class="gmail_extra" dir="auto"><div class="gmail_quote">On Dec 2, 2016 6:14 PM, "David Menendez" <<a href="mailto:dave@zednenem.com" target="_blank">dave@zednenem.com</a>> wrote:<blockquote class="m_-742088320925499526quote" 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>A while back, I found myself deriving this class:</div><div><br></div><div><div><div>    class Functor f => Siftable f where</div><div>        siftWith :: (a -> Maybe b) -> f a -> f b</div><div>        sift :: (a -> Bool) -> f a -> f a</div><div>        sift f = siftWith (\a -> if f a then Just a else Nothing)</div></div></div></div></div></div></blockquote></div></div><div dir="auto"><br></div><div dir="auto">I would expect several classes, corresponding to different methods of Witherable:</div><div dir="auto"><br></div><div dir="auto">class Siftable a m | m -> a where</div><div dir="auto">  sift :: (a -> Bool) -> m -> m</div><div dir="auto">  default sift :: SiftWithable f => (a -> Bool) -> f a -> f a</div><div dir="auto">  sift p = siftWith (\x -> x <$ guard (p x))</div><div dir="auto"><br></div><div dir="auto">class Functor f => SiftWithable f where</div><div dir="auto">  siftWith :: (a -> Maybe b) -> f a -> f b</div><div dir="auto"><br></div><div dir="auto">class Siftable a m => SiftableA a m where</div><div dir="auto">  siftA :: Applicative g => (a -> g Bool) -> m -> g m</div><div dir="auto">  default siftA :: (SiftWithAAble f, Applicative g) => (a -> g Bool) -> f a -> g (f a)</div><div dir="auto">  siftA p = siftWithA (\x -> (x <$) . guard <$> p x)</div><div dir="auto"><br></div><div dir="auto">class (Traversable f, SiftWithAble f) => SiftWithAAble f where</div><div dir="auto">  siftWithA :: Applicative g => (a -> g (Maybe b)) -> f a -> g (f a)</div><div class="gmail_extra" dir="auto"></div></div>