constraints 0.10.1 → 0.11
raw patch · 5 files changed
+106/−25 lines, 5 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
- Data.Constraint: instance () :: Constraint Data.Constraint.:=> GHC.Base.Alternative GHC.Base.Maybe
- Data.Constraint: instance () :: Constraint Data.Constraint.:=> GHC.Base.Applicative GHC.Base.Maybe
- Data.Constraint: instance () :: Constraint Data.Constraint.:=> GHC.Base.Functor GHC.Base.Maybe
- Data.Constraint: instance () :: Constraint Data.Constraint.:=> GHC.Base.MonadPlus GHC.Base.Maybe
- Data.Constraint: instance Data.Bits.Bits a Data.Constraint.:=> Data.Bits.Bits (Data.Functor.Const.Const a b)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint () :: Constraint
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (Data.Constraint.Class b a)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (GHC.Base.Functor f)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (GHC.Base.Semigroup a)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (GHC.Classes.Eq a)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (GHC.Enum.Bounded a)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (GHC.Enum.Enum a)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (GHC.Num.Num a)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (GHC.Read.Read a)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (GHC.Show.Show a)
- Data.Constraint: instance Data.Constraint.Class () :: Constraint (b Data.Constraint.:=> a)
- Data.Constraint: instance GHC.Base.Monoid a Data.Constraint.:=> GHC.Base.Monoid (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Base.Monoid a Data.Constraint.:=> GHC.Base.Monoid (GHC.Base.Maybe a)
- Data.Constraint: instance GHC.Base.Semigroup a Data.Constraint.:=> GHC.Base.Semigroup (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Base.Semigroup a Data.Constraint.:=> GHC.Base.Semigroup (GHC.Base.Maybe a)
- Data.Constraint: instance GHC.Classes.Eq a Data.Constraint.:=> GHC.Classes.Eq (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Classes.Eq a Data.Constraint.:=> GHC.Classes.Eq (GHC.Base.Maybe a)
- Data.Constraint: instance GHC.Classes.Ord a Data.Constraint.:=> GHC.Classes.Ord (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Classes.Ord a Data.Constraint.:=> GHC.Classes.Ord (GHC.Base.Maybe a)
- Data.Constraint: instance GHC.Enum.Bounded a Data.Constraint.:=> GHC.Enum.Bounded (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Enum.Enum a Data.Constraint.:=> GHC.Enum.Enum (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Float.Floating a Data.Constraint.:=> GHC.Float.Floating (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Float.RealFloat a Data.Constraint.:=> GHC.Float.RealFloat (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Num.Num a Data.Constraint.:=> GHC.Num.Num (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Read.Read a Data.Constraint.:=> GHC.Read.Read (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Read.Read a Data.Constraint.:=> GHC.Read.Read (GHC.Base.Maybe a)
- Data.Constraint: instance GHC.Real.Fractional a Data.Constraint.:=> GHC.Real.Fractional (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Real.Integral a Data.Constraint.:=> GHC.Real.Integral (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Real.Real a Data.Constraint.:=> GHC.Real.Real (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Real.RealFrac a Data.Constraint.:=> GHC.Real.RealFrac (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Show.Show a Data.Constraint.:=> GHC.Show.Show (Data.Functor.Const.Const a b)
- Data.Constraint: instance GHC.Show.Show a Data.Constraint.:=> GHC.Show.Show (GHC.Base.Maybe a)
- Data.Constraint.Deferrable: instance Data.Constraint.Deferrable.Deferrable () :: Constraint
- Data.Constraint.Deferrable: instance GHC.Exception.Exception Data.Constraint.Deferrable.UnsatisfiedConstraint
- Data.Constraint.Deferrable: instance forall i j (a :: i) (b :: j). (Data.Typeable.Internal.Typeable i, Data.Typeable.Internal.Typeable j, Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable b) => Data.Constraint.Deferrable.Deferrable ((a :: i) ~~ (b :: j))
- Data.Constraint.Deferrable: instance forall k (a :: k) (b :: k). (Data.Typeable.Internal.Typeable k, Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable b) => Data.Constraint.Deferrable.Deferrable (a ~ b)
- Data.Constraint.Forall: instance (p ~ c) => Data.Constraint.Forall.InstV p c
- Data.Constraint.Forall: instance forall k (p :: k -> GHC.Types.Constraint) (a :: k) (c :: GHC.Types.Constraint). (p a ~ c) => Data.Constraint.Forall.InstV p c
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting Control.DeepSeq.NFData GHC.Base.Maybe
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting Data.Binary.Class.Binary GHC.Base.Maybe
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting Data.Hashable.Class.Hashable GHC.Base.Maybe
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Base.Monoid GHC.Base.Maybe
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Base.Semigroup GHC.Base.Maybe
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Classes.Eq GHC.Base.Maybe
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Classes.Ord GHC.Base.Maybe
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Read.Read GHC.Base.Maybe
- Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Show.Show GHC.Base.Maybe
+ Data.Constraint: class HasDict c e | e -> c
+ Data.Constraint: evidence :: HasDict c e => e -> Dict c
+ Data.Constraint: infixr 9 :=>
+ Data.Constraint: instance () :: Constraint Data.Constraint.:=> GHC.Base.Alternative GHC.Maybe.Maybe
+ Data.Constraint: instance () :: Constraint Data.Constraint.:=> GHC.Base.Applicative GHC.Maybe.Maybe
+ Data.Constraint: instance () :: Constraint Data.Constraint.:=> GHC.Base.Functor GHC.Maybe.Maybe
+ Data.Constraint: instance () :: Constraint Data.Constraint.:=> GHC.Base.MonadPlus GHC.Maybe.Maybe
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (() :: Constraint)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (Data.Constraint.Class b a)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (GHC.Base.Functor f)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (GHC.Base.Semigroup a)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (GHC.Classes.Eq a)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (GHC.Enum.Bounded a)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (GHC.Enum.Enum a)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (GHC.Num.Num a)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (GHC.Read.Read a)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (GHC.Show.Show a)
+ Data.Constraint: instance Data.Constraint.Class (() :: Constraint) (b Data.Constraint.:=> a)
+ Data.Constraint: instance Data.Constraint.HasDict a (Data.Constraint.Dict a)
+ Data.Constraint: instance GHC.Base.Monoid a Data.Constraint.:=> GHC.Base.Monoid (GHC.Maybe.Maybe a)
+ Data.Constraint: instance GHC.Base.Semigroup a Data.Constraint.:=> GHC.Base.Semigroup (GHC.Maybe.Maybe a)
+ Data.Constraint: instance GHC.Classes.Eq a Data.Constraint.:=> GHC.Classes.Eq (GHC.Maybe.Maybe a)
+ Data.Constraint: instance GHC.Classes.Ord a Data.Constraint.:=> GHC.Classes.Ord (GHC.Maybe.Maybe a)
+ Data.Constraint: instance GHC.Read.Read a Data.Constraint.:=> GHC.Read.Read (GHC.Maybe.Maybe a)
+ Data.Constraint: instance GHC.Show.Show a Data.Constraint.:=> GHC.Show.Show (GHC.Maybe.Maybe a)
+ Data.Constraint: instance a => Data.Constraint.HasDict b (a Data.Constraint.:- b)
+ Data.Constraint: instance forall k (a :: k) (b :: k). Data.Constraint.HasDict (GHC.Types.Coercible a b) (Data.Type.Coercion.Coercion a b)
+ Data.Constraint: instance forall k (a :: k) (b :: k). Data.Constraint.HasDict (a Data.Type.Equality.~ b) (a Data.Type.Equality.:~: b)
+ Data.Constraint: instance forall k (a :: k). Data.Constraint.HasDict (Data.Typeable.Internal.Typeable k, Data.Typeable.Internal.Typeable a) (Data.Typeable.Internal.TypeRep a)
+ Data.Constraint: instance forall k a (b :: k). Data.Bits.Bits a Data.Constraint.:=> Data.Bits.Bits (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Base.Monoid a Data.Constraint.:=> GHC.Base.Monoid (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Base.Semigroup a Data.Constraint.:=> GHC.Base.Semigroup (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Classes.Eq a Data.Constraint.:=> GHC.Classes.Eq (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Classes.Ord a Data.Constraint.:=> GHC.Classes.Ord (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Enum.Bounded a Data.Constraint.:=> GHC.Enum.Bounded (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Enum.Enum a Data.Constraint.:=> GHC.Enum.Enum (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Float.Floating a Data.Constraint.:=> GHC.Float.Floating (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Float.RealFloat a Data.Constraint.:=> GHC.Float.RealFloat (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Num.Num a Data.Constraint.:=> GHC.Num.Num (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Read.Read a Data.Constraint.:=> GHC.Read.Read (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Real.Fractional a Data.Constraint.:=> GHC.Real.Fractional (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Real.Integral a Data.Constraint.:=> GHC.Real.Integral (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Real.Real a Data.Constraint.:=> GHC.Real.Real (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Real.RealFrac a Data.Constraint.:=> GHC.Real.RealFrac (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k a (b :: k). GHC.Show.Show a Data.Constraint.:=> GHC.Show.Show (Data.Functor.Const.Const a b)
+ Data.Constraint: instance forall k2 k1 (a :: k1) (b :: k2). Data.Constraint.HasDict (a GHC.Types.~~ b) (a Data.Type.Equality.:~~: b)
+ Data.Constraint: type (⊢) = (:-)
+ Data.Constraint.Deferrable: infix 4 :~:
+ Data.Constraint.Deferrable: instance Data.Constraint.Deferrable.Deferrable (() :: Constraint)
+ Data.Constraint.Deferrable: instance GHC.Exception.Type.Exception Data.Constraint.Deferrable.UnsatisfiedConstraint
+ Data.Constraint.Deferrable: instance forall i j (a :: i) (b :: j). (Data.Typeable.Internal.Typeable i, Data.Typeable.Internal.Typeable j, Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable b) => Data.Constraint.Deferrable.Deferrable (a GHC.Types.~~ b)
+ Data.Constraint.Deferrable: instance forall k (a :: k) (b :: k). (Data.Typeable.Internal.Typeable k, Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable b) => Data.Constraint.Deferrable.Deferrable (a Data.Type.Equality.~ b)
+ Data.Constraint.Forall: instance (p Data.Type.Equality.~ c) => Data.Constraint.Forall.InstV p c
+ Data.Constraint.Forall: instance forall k (p :: k -> GHC.Types.Constraint) (a :: k) (c :: GHC.Types.Constraint). (p a Data.Type.Equality.~ c) => Data.Constraint.Forall.InstV p c
+ Data.Constraint.Forall: type family ForallV :: k -> Constraint
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting Control.DeepSeq.NFData GHC.Maybe.Maybe
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting Data.Binary.Class.Binary GHC.Maybe.Maybe
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting Data.Hashable.Class.Hashable GHC.Maybe.Maybe
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Base.Monoid GHC.Maybe.Maybe
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Base.Semigroup GHC.Maybe.Maybe
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Classes.Eq GHC.Maybe.Maybe
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Classes.Ord GHC.Maybe.Maybe
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Read.Read GHC.Maybe.Maybe
+ Data.Constraint.Lifting: instance Data.Constraint.Lifting.Lifting GHC.Show.Show GHC.Maybe.Maybe
+ Data.Constraint.Nat: infixl 7 `Mod`
+ Data.Constraint.Nat: minusNat :: forall n m. (KnownNat n, KnownNat m, m <= n) :- KnownNat (n - m)
+ Data.Constraint.Nat: minusZero :: forall n. Dict ((n - 0) ~ n)
+ Data.Constraint.Nat: type family Mod (a :: Nat) (b :: Nat) :: Nat
+ Data.Constraint.Symbol: type family Length :: Symbol -> Nat
- Data.Constraint: (\\) :: a => (b => r) -> (a :- b) -> r
+ Data.Constraint: (\\) :: HasDict c e => (c => r) -> e -> r
- Data.Constraint: newtype a (:-) b
+ Data.Constraint: newtype a :- b
- Data.Constraint: strengthen1 :: Dict b -> a :- c -> a :- (b, c)
+ Data.Constraint: strengthen1 :: Dict b -> (a :- c) -> a :- (b, c)
- Data.Constraint: strengthen2 :: Dict b -> a :- c -> a :- (c, b)
+ Data.Constraint: strengthen2 :: Dict b -> (a :- c) -> a :- (c, b)
- Data.Constraint: withDict :: Dict a -> (a => r) -> r
+ Data.Constraint: withDict :: HasDict c e => e -> (c => r) -> r
- Data.Constraint.Deferrable: [HRefl] :: a :~~: a
+ Data.Constraint.Deferrable: [HRefl] :: forall k1 k2 (a :: k1) (b :: k2). () => a :~~: a
- Data.Constraint.Deferrable: [Refl] :: a :~: a
+ Data.Constraint.Deferrable: [Refl] :: forall k (a :: k) (b :: k). () => a :~: a
- Data.Constraint.Deferrable: data (:~:) (a :: k) (b :: k) :: forall k. () => k -> k -> *
+ Data.Constraint.Deferrable: data (:~:) (a :: k) (b :: k) :: forall k. () => k -> k -> Type
- Data.Constraint.Deferrable: data (:~~:) (a :: k1) (b :: k2) :: forall k1 k2. () => k1 -> k2 -> *
+ Data.Constraint.Deferrable: data (:~~:) (a :: k1) (b :: k2) :: forall k1 k2. () => k1 -> k2 -> Type
- Data.Constraint.Forall: instT :: forall (p :: k4 -> Constraint) (t :: (k1 -> k2) -> k3 -> k4) (f :: k1 -> k2) (a :: k3). ForallT p t :- p (t f a)
+ Data.Constraint.Forall: instT :: forall k1 k2 k3 k4 (p :: k4 -> Constraint) (t :: (k1 -> k2) -> k3 -> k4) (f :: k1 -> k2) (a :: k3). ForallT p t :- p (t f a)
- Data.Constraint.Nat: dividesDef :: forall a b. Divides a b :- ((a * Div b a) ~ a)
+ Data.Constraint.Nat: dividesDef :: forall a b. Divides a b :- ((a * Div b a) ~ b)
- Data.Constraint.Nat: euclideanNat :: (1 <= c) :- (a ~ (c * Div a c + Mod a c))
+ Data.Constraint.Nat: euclideanNat :: (1 <= c) :- (a ~ ((c * Div a c) + Mod a c))
- Data.Constraint.Nat: plusDistributesOverTimes :: forall n m o. Dict ((n * (m + o)) ~ (n * m + n * o))
+ Data.Constraint.Nat: plusDistributesOverTimes :: forall n m o. Dict ((n * (m + o)) ~ ((n * m) + (n * o)))
- Data.Constraint.Nat: plusMonotone1 :: forall a b c. (a <= b) :- (a + c <= b + c)
+ Data.Constraint.Nat: plusMonotone1 :: forall a b c. (a <= b) :- ((a + c) <= (b + c))
- Data.Constraint.Nat: plusMonotone2 :: forall a b c. (b <= c) :- (a + b <= a + c)
+ Data.Constraint.Nat: plusMonotone2 :: forall a b c. (b <= c) :- ((a + b) <= (a + c))
- Data.Constraint.Nat: timesDistributesOverPow :: forall n m o. Dict ((n ^ (m + o)) ~ (n ^ m * n ^ o))
+ Data.Constraint.Nat: timesDistributesOverPow :: forall n m o. Dict ((n ^ (m + o)) ~ ((n ^ m) * (n ^ o)))
- Data.Constraint.Nat: timesDiv :: forall a b. Dict ((a * Div b a) <= a)
+ Data.Constraint.Nat: timesDiv :: forall a b. Dict ((a * Div b a) <= b)
- Data.Constraint.Nat: timesMonotone1 :: forall a b c. (a <= b) :- (a * c <= b * c)
+ Data.Constraint.Nat: timesMonotone1 :: forall a b c. (a <= b) :- ((a * c) <= (b * c))
- Data.Constraint.Nat: timesMonotone2 :: forall a b c. (b <= c) :- (a * b <= a * c)
+ Data.Constraint.Nat: timesMonotone2 :: forall a b c. (b <= c) :- ((a * b) <= (a * c))
- Data.Constraint.Symbol: takeAppendDrop :: forall n a. Dict (Take n a ++ Drop n a ~ a)
+ Data.Constraint.Symbol: takeAppendDrop :: forall n a. Dict ((Take n a ++ Drop n a) ~ a)
Files
- CHANGELOG.markdown +16/−1
- constraints.cabal +6/−5
- src/Data/Constraint.hs +61/−10
- src/Data/Constraint/Forall.hs +7/−1
- src/Data/Constraint/Nat.hs +16/−8
CHANGELOG.markdown view
@@ -1,3 +1,18 @@+0.11 [2019.05.10]+-----------------+* Introduce a `HasDict` type class for types that witness evidence of+ constraints, such as `Dict`, `(:-)`, `Coercion`, `(:~:)`, `(:~~:)`, and+ `TypeRep`.+* Generalize the types of `withDict` and `(\\)` to be polymorphic over+ any `HasDict` instance.+* Add `type (⊢) = (:-)`.+* Fix unsafe mistakes in the statements of `dividesDef` and `timesDiv` in+ `Data.Constraint.Nat`.+* Make the implementations of `Min` and `Max` reduce on more inputs in+ `Data.Constraint.Nat`.+* Add `minusNat` and `minusZero` functions to `Data.Constraint.Nat`.+* Support `hashable-1.3.*` and `semigroups-0.19.*`.+ 0.10.1 [2018.07.02] ------------------- * Allow building with GHC 8.6.@@ -41,7 +56,7 @@ when a type mismatch error is thrown * Add `defer_` and `deferEither_`, counterparts to `defer` and `deferEither` which do not require proxy arguments- * Enable `PolyKinds`. This allows the `Deferrable (a ~ b` instance to be+ * Enable `PolyKinds`. This allows the `Deferrable (a ~ b)` instance to be polykinded on all supported versions of GHC _except_ 7.10, where the kinds must be `*` due to an old GHC bug * Introduce a heterogeneous equality type `(:~~:)`, and use it to define a
constraints.cabal view
@@ -1,6 +1,6 @@ name: constraints category: Constraints-version: 0.10.1+version: 0.11 license: BSD2 cabal-version: >= 1.10 license-file: LICENSE@@ -21,8 +21,9 @@ , GHC == 7.10.3 , GHC == 8.0.2 , GHC == 8.2.2- , GHC == 8.4.3- , GHC == 8.6.1+ , GHC == 8.4.4+ , GHC == 8.6.5+ , GHC == 8.8.1 extra-source-files: README.markdown , CHANGELOG.markdown @@ -51,9 +52,9 @@ binary >= 0.7.1 && < 0.9, deepseq >= 1.3 && < 1.5, ghc-prim,- hashable >= 1.2 && < 1.3,+ hashable >= 1.2 && < 1.4, mtl >= 2.1.2 && < 2.3,- semigroups >= 0.17 && < 0.19,+ semigroups >= 0.17 && < 0.20, transformers >= 0.3.0.0 && < 0.6, transformers-compat >= 0.5 && < 1
src/Data/Constraint.hs view
@@ -11,12 +11,17 @@ {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UnicodeSyntax #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE Trustworthy #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE CPP #-}+#if __GLASGOW_HASKELL__ >= 706+{-# LANGUAGE PolyKinds #-}+#endif #if __GLASGOW_HASKELL__ >= 800+{-# LANGUAGE TypeInType #-} {-# LANGUAGE UndecidableSuperClasses #-} #endif #if __GLASGOW_HASKELL__ >= 708 && __GLASGOW_HASKELL__ < 710@@ -56,10 +61,12 @@ Constraint -- * Dictionary , Dict(Dict)+ , HasDict(..) , withDict+ , (\\) -- * Entailment , (:-)(Sub)- , (\\)+ , type (⊢) , weaken1, weaken2, contract , strengthen1, strengthen2 , (&&&), (***)@@ -78,11 +85,14 @@ import Control.DeepSeq import Control.Monad import Data.Complex+#if __GLASGOW_HASKELL__ >= 800 && __GLASGOW_HASKELL__ < 806+import Data.Kind+#endif import Data.Ratio #if !MIN_VERSION_base(4,11,0) import Data.Semigroup #endif-import Data.Data+import Data.Data hiding (TypeRep) import qualified GHC.Exts as Exts (Any) import GHC.Exts (Constraint) import Data.Bits (Bits)@@ -93,6 +103,12 @@ #if !MIN_VERSION_base(4,8,0) import Data.Word (Word) #endif+import Data.Coerce (Coercible)+import Data.Type.Coercion(Coercion(..))+#if MIN_VERSION_base(4,10,0)+import Data.Type.Equality (type (~~))+import Type.Reflection (TypeRep, typeRepKind, withTypeable)+#endif -- | Values of type @'Dict' p@ capture a dictionary for a constraint of type @p@. --@@ -136,18 +152,59 @@ instance NFData (Dict c) where rnf Dict = () +-- | Witnesses that a value of type @e@ contains evidence of the constraint @c@.+--+-- Mainly intended to allow ('\\') to be overloaded, since it's a useful operator.+class HasDict c e | e -> c where+ evidence :: e -> Dict c++instance HasDict a (Dict a) where+ evidence = Prelude.id++instance a => HasDict b (a :- b) where+ evidence (Sub x) = x++instance HasDict (Coercible a b) (Coercion a b) where+ evidence Coercion = Dict++instance HasDict (a ~ b) (a :~: b) where+ evidence Refl = Dict++#if MIN_VERSION_base(4,10,0)+instance HasDict (a ~~ b) (a :~~: b) where+ evidence HRefl = Dict++instance HasDict (Typeable k, Typeable a) (TypeRep (a :: k)) where+ evidence tr = withTypeable tr $ withTypeable (typeRepKind tr) Dict+#endif+ -- | From a 'Dict', takes a value in an environment where the instance -- witnessed by the 'Dict' is in scope, and evaluates it. -- -- Essentially a deconstruction of a 'Dict' into its continuation-style -- form. ---withDict :: Dict a -> (a => r) -> r-withDict d r = case d of+-- Can also be used to deconstruct an entailment, @a ':-' b@, using a context @a@.+--+-- @+-- withDict :: 'Dict' c -> (c => r) -> r+-- withDict :: a => (a ':-' c) -> (c => r) -> r+-- @+withDict :: HasDict c e => e -> (c => r) -> r+withDict d r = case evidence d of Dict -> r +infixl 1 \\ -- required comment++-- | Operator version of 'withDict', with the arguments flipped+(\\) :: HasDict c e => (c => r) -> e -> r+r \\ d = withDict d r+ infixr 9 :-+infixr 9 ⊢ +type (⊢) = (:-)+ -- | This is the type of entailment. -- -- @a ':-' b@ is read as @a@ \"entails\" @b@.@@ -244,12 +301,6 @@ instance a => NFData (a :- b) where rnf (Sub Dict) = ()--infixl 1 \\ -- required comment---- | Given that @a :- b@, derive something that needs a context @b@, using the context @a@-(\\) :: a => (b => r) -> (a :- b) -> r-r \\ Sub Dict = r -------------------------------------------------------------------------------- -- Constraints form a Category
src/Data/Constraint/Forall.hs view
@@ -40,6 +40,12 @@ import Data.Constraint import Unsafe.Coerce (unsafeCoerce) +#if __GLASGOW_HASKELL__ >= 806+# define KVS(kvs) kvs+#else+# define KVS(kvs)+#endif+ {- The basic trick of this module is to use "skolem" types as test candidates - for whether a class predicate holds, and if so assume that it holds for all - types, unsafely coercing the typeclass dictionary.@@ -143,7 +149,7 @@ instance Forall (Q p t) => ForallT p t -- | Instantiate a quantified @'ForallT' p t@ constraint at types @f@ and @a@.-instT :: forall (p :: k4 -> Constraint) (t :: (k1 -> k2) -> k3 -> k4) (f :: k1 -> k2) (a :: k3). ForallT p t :- p (t f a)+instT :: forall KVS(k1 k2 k3 k4) (p :: k4 -> Constraint) (t :: (k1 -> k2) -> k3 -> k4) (f :: k1 -> k2) (a :: k3). ForallT p t :- p (t f a) instT = Sub $ case inst :: Forall (Q p t) :- Q p t f of { Sub Dict -> case inst :: Forall (R p t f) :- R p t f a of
src/Data/Constraint/Nat.hs view
@@ -10,6 +10,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE Trustworthy #-}+{-# LANGUAGE UndecidableInstances #-} #if __GLASGOW_HASKELL__ >= 805 {-# LANGUAGE NoStarIsType #-} #endif@@ -18,8 +19,8 @@ -- This module is only available on GHC 8.0 or later. module Data.Constraint.Nat ( Min, Max, Lcm, Gcd, Divides, Div, Mod- , plusNat, timesNat, powNat, minNat, maxNat, gcdNat, lcmNat, divNat, modNat- , plusZero, timesZero, timesOne, powZero, powOne, maxZero, minZero, gcdZero, gcdOne, lcmZero, lcmOne+ , plusNat, minusNat, timesNat, powNat, minNat, maxNat, gcdNat, lcmNat, divNat, modNat+ , plusZero, minusZero, timesZero, timesOne, powZero, powOne, maxZero, minZero, gcdZero, gcdOne, lcmZero, lcmOne , plusAssociates, timesAssociates, minAssociates, maxAssociates, gcdAssociates, lcmAssociates , plusCommutes, timesCommutes, minCommutes, maxCommutes, gcdCommutes, lcmCommutes , plusDistributesOverTimes, timesDistributesOverPow, timesDistributesOverGcd, timesDistributesOverLcm@@ -47,13 +48,14 @@ import Data.Constraint import Data.Proxy+import Data.Type.Bool import GHC.TypeLits import Unsafe.Coerce type family Min (m::Nat) (n::Nat) :: Nat where- Min m m = m+ Min m n = If (n <=? m) n m type family Max (m::Nat) (n::Nat) :: Nat where- Max m m = m+ Max m n = If (n <=? m) m n #if !(MIN_VERSION_base(4,11,0)) type family Div (m::Nat) (n::Nat) :: Nat where Div m 1 = m@@ -114,6 +116,9 @@ plusNat :: forall n m. (KnownNat n, KnownNat m) :- KnownNat (n + m) plusNat = magic (+) +minusNat :: forall n m. (KnownNat n, KnownNat m, m <= n) :- KnownNat (n - m)+minusNat = Sub $ case magic @n @m (-) of Sub r -> r+ minNat :: forall n m. (KnownNat n, KnownNat m) :- KnownNat (Min n m) minNat = magic min @@ -135,6 +140,9 @@ plusZero :: forall n. Dict ((n + 0) ~ n) plusZero = Dict +minusZero :: forall n. Dict ((n - 0) ~ n)+minusZero = Dict+ timesZero :: forall n. Dict ((n * 0) ~ 0) timesZero = Dict @@ -142,10 +150,10 @@ timesOne = Dict minZero :: forall n. Dict (Min n 0 ~ 0)-minZero = axiom+minZero = Dict maxZero :: forall n. Dict (Max n 0 ~ n)-maxZero = axiom+maxZero = Dict powZero :: forall n. Dict ((n ^ 0) ~ 1) powZero = Dict@@ -324,13 +332,13 @@ dividesMax :: (Divides a b, Divides a c) :- Divides a (Max b c) dividesMax = Sub axiom -dividesDef :: forall a b. Divides a b :- ((a * Div b a) ~ a)+dividesDef :: forall a b. Divides a b :- ((a * Div b a) ~ b) dividesDef = Sub axiom dividesPow :: (1 <= n, Divides a b) :- Divides a (b^n) dividesPow = Sub axiom -timesDiv :: forall a b. Dict ((a * Div b a) <= a)+timesDiv :: forall a b. Dict ((a * Div b a) <= b) timesDiv = axiom -- (<=) is an internal category in the category of constraints.