heterogeneous-comparison: Comparison of distinctly typed values with evidence capture

[ bsd3, data, library ] [ Propose Tags ] [ Report a vulnerability ]

There are times when values need to be tested for equality or compared for ordering, even if they aren't statically known to be of equivalent types. Such a test, if successful, may allow that knowledge to be recovered. We improve upon the state of the art in this domain by generalising over different notions of type equivalence.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.0.0
Change log CHANGELOG.md
Dependencies base (>=4.18 && <5), deepseq (>=1.1 && <1.6), hashable (>=1.1.1 && <1.6), ord-axiomata (>=0.1 && <0.2), primitive (>=0.6.2 && <0.10), stm (>=2.4 && <2.6) [details]
Tested with ghc ==9.6.7, ghc ==9.8.4, ghc ==9.10.2, ghc ==9.12.2
License BSD-3-Clause
Copyright (c) L. S. Leary 2025
Author L. S. Leary
Maintainer L.S.Leary.II@gmail.com
Category Data
Home page https://github.com/LSLeary/heterogeneous-comparison
Bug tracker https://github.com/LSLeary/heterogeneous-comparison/issues
Source repo head: git clone https://github.com/LSLeary/heterogeneous-comparison.git
this: git clone https://github.com/LSLeary/heterogeneous-comparison.git(tag v0.1.0.0)
Uploaded by Leary at 2025-08-01T11:30:24Z
Distributions
Downloads 4 total (4 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for heterogeneous-comparison-0.1.0.0

[back to package description]

heterogeneous-comparison

There are times when values need to be tested for equality or compared for ordering, even if they aren't statically known to be of equivalent types. Such a test, if successful, may allow that knowledge to be recovered.

Prior Art

base (on singletons):

  • TestCoercion f \(\approx\) (HetEq f, Strength f ~ Representational)
  • TestEquality f \(\approx\) (HetEq f, Strength f ~ Nominal)

some (universally):

  • GEq f \(\cong\) (HetEq f, Strength f ~ Nominal)
  • GCompare f \(\cong\) (HetOrd f, Strength f ~ Nominal)

Improvements

HetEq and HetOrd are generalised over the strength of evidence captured. This allows them to admit and combine a much broader range of instances, e.g.

instance Eq a => HetEq (Const a) where
  type Strength (Const a) = Phantom
  ...
instance HetEq IORef where
  type Strength IORef = Representational
  ...
instance HetEq TypeRep where
  type Strength TypeRep = Nominal
  ...

type HetEq' f = (KnownRole (Strength f), HetEq f)

instance (HetEq' f, HetEq' g) => HetEq (Product f g) where
  type Strength (Product f g) = Max (Strength f) (Strength g)
  ...
instance (HetEq' f, HetEq' g) => HetEq (Sum     f g) where
  type Strength (Sum     f g) = Min (Strength f) (Strength g)
  ...

Consequently, Data.Hetero.Some has much broader Eq and Ord instances than Data.Some:

instance HetEq  f => Eq  (Some f)
instance HetOrd f => Ord (Some f)

dependent-map could similarly broaden the range of key types by replacing GCompare k with (HetOrd k, Strength k > Phantom), though the rare operations requiring Has' _ k f constraints might not come out on top.