Consideration to add `ordering` function to `Data.Ord`

George Wilson george at wils.online
Mon Jan 11 09:10:01 UTC 2021


I am weakly in favour of this.
Having catamorphisms for these basic types seems handy, although I
think I would personally almost always use a pattern match in the case
of Ordering.

Cheers,
George

On Sat, 2 Jan 2021 at 12:15, Ian Treyball <ict2102 at columbia.edu> wrote:
>
> Good day,
>
> In short, I think it would be nice to add the following ordering
> function to the Data.Ord module:
>
> -- | Case analysis for the 'Ordering' type. @'ordering' x y z o @
> evaluates to @x@
> -- when @o@ is 'LT', @y@ when @o@ is EQ, and evaluates to @z@ when @o@ is 'GT'.
> ordering :: a -> a -> a -> Ordering -> a
> ordering lt _  _  LT = lt
> ordering _  eq _  EQ = eq
> ordering _  _  gt GT = gt
>
> This would be essentially analogous to the bool function from Data.Bool:
>
> bool :: a -> a -> Bool -> a
> bool f _ False = f
> bool _ t True  = t
>
> Because the bool function is the case-analysis for the Bool data type,
> and the order of the parameters matches the order in which the
> constructors are defined:
>
> Data Bool = False | True
>
> I decided it would be consistent to follow the same approach for the
> ordering implementation and so I use the particular ordering (no pun
> intended) for the parameters to also match the order of the
> constructors:
>
> Data Ordering = LT | EQ | GT
>
> I will also add an example use case, here is how show could be
> implemented using the proposed function (of course, we momentarily
> assume it is not derived, for sake of simplicity):
>
> instance Show Ordering where
>   show :: Ordering -> String
>   show = ordering "LT" "EQ" "GT"
>
> Please let me know if you would wish for me to share more compelling
> examples, I have a few, but they are longer (so not here included for
> brevity's sake).
>
> I hope the formatting comes out okay, I will link to a gist[1], just in case.
>
> If this sounds acceptable, please let me know how to proceed (would
> this fall under "Core Libraries Proposal"[2]? I don't necessarily see
> adding this function as a breaking change, so I'm not sure, but I can
> surely fill one out if it's appropriate); otherwise, thank you for
> your time and consideration.
>
> Respectfully,
>
> Ian Treyball
>
> [1] https://gist.github.com/subttle/b49762a929f25e349381ef161bbc33d0
>
> [2] https://github.com/haskell-core/core-libraries-proposals
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries


More information about the Libraries mailing list