<div dir="ltr"><div>Hello Cafè,<br><br>I'd like to share a piece of code I've found useful to nest ordering on EQ.<br><br>{-# language GADTs #-} <br><br>import Data.Monoid (mconcat) <br>import Data.Ord (comparing) <br><br>data Orderings t where <br>  Ascending :: Ord a => (t -> a) -> Orderings t <br>  Descending :: Ord a => (t -> a) -> Orderings t <br><br>comparings :: [Orderings t] -> t -> t -> Ordering <br>comparings c x y = mconcat $ map g c where <br>  g (Ascending f) = comparing f x y <br>  g (Descending f) = comparing f y x<br> <br><br>I couldn't find a simpler solution, maybe somebody else has one.<br><br>I've tried using <br>comparings :: [forall a. Ord a =>  t -> a]  -> t -> t -> Ordering <br>which is not compiling for impredicativity and I'd like to understand better.<br><br>An example on sorting (Ord a, Ord b, Ord c) => [(a,(b,c)] with 'a' in opposite order, then 'c' and 'b' in ascending order goes like<br><br>sortBy (comparings [Descending fst, Ascending $ snd . snd, Ascending $ fst . snd])<br><br></div><div>Thanks for help/comments<br><br></div><div>paolino<br></div><div><br></div></div>