summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Scott <ryan.gl.scott@gmail.com>2017-02-23 18:09:58 -0500
committerBen Gamari <ben@smart-cactus.org>2017-02-23 18:57:17 -0500
commitc88b7c9a06e387c3b9bdb359b9e1e4f3a9fba696 (patch)
treed0291e43a1506c10385a4b3e29b5d7cdae3d0b77
parent8d64395b43cb73d110767cab512a368b3db018de (diff)
downloadhaskell-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.hs5
-rw-r--r--libraries/base/Data/Data.hs5
-rw-r--r--libraries/base/Data/Type/Coercion.hs4
-rw-r--r--libraries/base/Data/Type/Equality.hs25
-rw-r--r--testsuite/tests/annotations/should_fail/annfail10.stderr2
-rw-r--r--testsuite/tests/typecheck/should_fail/T12921.stderr2
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" #-}