diff options
author | Ryan Scott <ryan.gl.scott@gmail.com> | 2017-02-23 18:09:58 -0500 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-02-23 18:57:17 -0500 |
commit | c88b7c9a06e387c3b9bdb359b9e1e4f3a9fba696 (patch) | |
tree | d0291e43a1506c10385a4b3e29b5d7cdae3d0b77 | |
parent | 8d64395b43cb73d110767cab512a368b3db018de (diff) | |
download | haskell-c88b7c9a06e387c3b9bdb359b9e1e4f3a9fba696.tar.gz |
Add instances for (:~~:) mirroring those for (:~:)
`(:~~:)`, the hetergeneous version of `(:~:)`, should have class
instances similar to those of `(:~:)`, especially since their
implementations aren't particularly tricky or surprising. This adds
them.
Reviewers: bgamari, austin, hvr, goldfire
Reviewed By: bgamari
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D3181
-rw-r--r-- | libraries/base/Control/Category.hs | 5 | ||||
-rw-r--r-- | libraries/base/Data/Data.hs | 5 | ||||
-rw-r--r-- | libraries/base/Data/Type/Coercion.hs | 4 | ||||
-rw-r--r-- | libraries/base/Data/Type/Equality.hs | 25 | ||||
-rw-r--r-- | testsuite/tests/annotations/should_fail/annfail10.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/typecheck/should_fail/T12921.stderr | 2 |
6 files changed, 41 insertions, 2 deletions
diff --git a/libraries/base/Control/Category.hs b/libraries/base/Control/Category.hs index cc7648060c..ba92178bae 100644 --- a/libraries/base/Control/Category.hs +++ b/libraries/base/Control/Category.hs @@ -56,6 +56,11 @@ instance Category (:~:) where id = Refl Refl . Refl = Refl +-- | @since 4.10.0.0 +instance Category (:~~:) where + id = HRefl + HRefl . HRefl = HRefl + -- | @since 4.7.0.0 instance Category Coercion where id = Coercion diff --git a/libraries/base/Data/Data.hs b/libraries/base/Data/Data.hs index 12f9378a9a..8233f98b1c 100644 --- a/libraries/base/Data/Data.hs +++ b/libraries/base/Data/Data.hs @@ -1210,6 +1210,11 @@ deriving instance (Data t) => Data (Proxy t) -- | @since 4.7.0.0 deriving instance (a ~ b, Data a) => Data (a :~: b) +-- | @since 4.10.0.0 +deriving instance (Typeable i, Typeable j, Typeable a, Typeable b, + (a :: i) ~~ (b :: j)) + => Data (a :~~: b) + -- | @since 4.7.0.0 deriving instance (Coercible a b, Data a, Data b) => Data (Coercion a b) diff --git a/libraries/base/Data/Type/Coercion.hs b/libraries/base/Data/Type/Coercion.hs index 318d0983f2..2358115c6d 100644 --- a/libraries/base/Data/Type/Coercion.hs +++ b/libraries/base/Data/Type/Coercion.hs @@ -105,6 +105,10 @@ class TestCoercion f where instance TestCoercion ((Eq.:~:) a) where testCoercion Eq.Refl Eq.Refl = Just Coercion +-- | @since 4.10.0.0 +instance TestCoercion ((Eq.:~~:) a) where + testCoercion Eq.HRefl Eq.HRefl = Just Coercion + -- | @since 4.7.0.0 instance TestCoercion (Coercion a) where testCoercion Coercion Coercion = Just Coercion diff --git a/libraries/base/Data/Type/Equality.hs b/libraries/base/Data/Type/Equality.hs index 73f8407cb0..69da70b78c 100644 --- a/libraries/base/Data/Type/Equality.hs +++ b/libraries/base/Data/Type/Equality.hs @@ -145,6 +145,27 @@ deriving instance a ~ b => Bounded (a :~: b) data (a :: k1) :~~: (b :: k2) where HRefl :: a :~~: a +-- | @since 4.10.0.0 +deriving instance Eq (a :~~: b) +-- | @since 4.10.0.0 +deriving instance Show (a :~~: b) +-- | @since 4.10.0.0 +deriving instance Ord (a :~~: b) + +-- | @since 4.10.0.0 +instance a ~~ b => Read (a :~~: b) where + readsPrec d = readParen (d > 10) (\r -> [(HRefl, s) | ("HRefl",s) <- lex r ]) + +-- | @since 4.10.0.0 +instance a ~~ b => Enum (a :~~: b) where + toEnum 0 = HRefl + toEnum _ = errorWithoutStackTrace "Data.Type.Equality.toEnum: bad argument" + + fromEnum HRefl = 0 + +-- | @since 4.10.0.0 +deriving instance a ~~ b => Bounded (a :~~: b) + -- | This class contains types where you can learn the equality of two types -- from information contained in /terms/. Typically, only singleton types should -- inhabit this class. @@ -156,6 +177,10 @@ class TestEquality f where instance TestEquality ((:~:) a) where testEquality Refl Refl = Just Refl +-- | @since 4.10.0.0 +instance TestEquality ((:~~:) a) where + testEquality HRefl HRefl = Just Refl + -- | A type family to compute Boolean equality. Instances are provided -- only for /open/ kinds, such as @*@ and function kinds. Instances are -- also provided for datatypes exported from base. A poly-kinded instance diff --git a/testsuite/tests/annotations/should_fail/annfail10.stderr b/testsuite/tests/annotations/should_fail/annfail10.stderr index 0dea31a872..6329c38e6d 100644 --- a/testsuite/tests/annotations/should_fail/annfail10.stderr +++ b/testsuite/tests/annotations/should_fail/annfail10.stderr @@ -10,7 +10,7 @@ annfail10.hs:9:1: error: instance Data.Data.Data Ordering -- Defined in ‘Data.Data’ instance Data.Data.Data Integer -- Defined in ‘Data.Data’ ...plus 15 others - ...plus 41 instances involving out-of-scope types + ...plus 42 instances involving out-of-scope types (use -fprint-potential-instances to see them all) • In the annotation: {-# ANN f 1 #-} diff --git a/testsuite/tests/typecheck/should_fail/T12921.stderr b/testsuite/tests/typecheck/should_fail/T12921.stderr index a3ac8a2cc0..422ec7dbd3 100644 --- a/testsuite/tests/typecheck/should_fail/T12921.stderr +++ b/testsuite/tests/typecheck/should_fail/T12921.stderr @@ -10,7 +10,7 @@ T12921.hs:4:1: error: instance Data.Data.Data Ordering -- Defined in ‘Data.Data’ instance Data.Data.Data Integer -- Defined in ‘Data.Data’ ...plus 15 others - ...plus 41 instances involving out-of-scope types + ...plus 42 instances involving out-of-scope types (use -fprint-potential-instances to see them all) • In the annotation: {-# ANN module "HLint: ignore Reduce duplication" #-} |