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

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

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]

Properties

Versions 0.1.0.0, 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]
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:28:57Z

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


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):

some (universally):

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.