Copyright | (C) 2013 Richard Eisenberg |
---|---|
License | BSD-style (see LICENSE) |
Maintainer | Richard Eisenberg (eir@cis.upenn.edu) |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
This module contains everything you need to derive your own singletons via Template Haskell.
TURN ON -XScopedTypeVariables
IN YOUR MODULE IF YOU WANT THIS TO WORK.
- singletons :: DsMonad q => q [Dec] -> q [Dec]
- singletonsOnly :: DsMonad q => q [Dec] -> q [Dec]
- genSingletons :: DsMonad q => [Name] -> q [Dec]
- promote :: DsMonad q => q [Dec] -> q [Dec]
- promoteOnly :: DsMonad q => q [Dec] -> q [Dec]
- genDefunSymbols :: DsMonad q => [Name] -> q [Dec]
- genPromotions :: DsMonad q => [Name] -> q [Dec]
- promoteEqInstances :: DsMonad q => [Name] -> q [Dec]
- promoteEqInstance :: DsMonad q => Name -> q [Dec]
- singEqInstances :: DsMonad q => [Name] -> q [Dec]
- singEqInstance :: DsMonad q => Name -> q [Dec]
- singEqInstancesOnly :: DsMonad q => [Name] -> q [Dec]
- singEqInstanceOnly :: DsMonad q => Name -> q [Dec]
- singDecideInstances :: DsMonad q => [Name] -> q [Dec]
- singDecideInstance :: DsMonad q => Name -> q [Dec]
- promoteOrdInstances :: DsMonad q => [Name] -> q [Dec]
- promoteOrdInstance :: DsMonad q => Name -> q [Dec]
- singOrdInstances :: DsMonad q => [Name] -> q [Dec]
- singOrdInstance :: DsMonad q => Name -> q [Dec]
- promoteBoundedInstances :: DsMonad q => [Name] -> q [Dec]
- promoteBoundedInstance :: DsMonad q => Name -> q [Dec]
- singBoundedInstances :: DsMonad q => [Name] -> q [Dec]
- singBoundedInstance :: DsMonad q => Name -> q [Dec]
- promoteEnumInstances :: DsMonad q => [Name] -> q [Dec]
- promoteEnumInstance :: DsMonad q => Name -> q [Dec]
- singEnumInstances :: DsMonad q => [Name] -> q [Dec]
- singEnumInstance :: DsMonad q => Name -> q [Dec]
- cases :: DsMonad q => Name -> q Exp -> q Exp -> q Exp
- sCases :: DsMonad q => Name -> q Exp -> q Exp -> q Exp
- data family Sing a
- module Data.Singletons
- class (kproxy ~ KProxy) => PEq kproxy where
- type family If cond tru fls :: k
- sIf :: Sing a -> Sing b -> Sing c -> Sing (If a b c)
- type family a :&& a :: Bool
- class (kparam ~ KProxy) => SEq kparam where
- class (PEq (KProxy :: KProxy a), kproxy ~ KProxy) => POrd kproxy where
- class (SEq (KProxy :: KProxy a), kproxy ~ KProxy) => SOrd kproxy where
- sCompare :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply CompareSym0 t) t :: Ordering)
- (%:<) :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply (:<$) t) t :: Bool)
- (%:<=) :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply (:<=$) t) t :: Bool)
- (%:>) :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply (:>$) t) t :: Bool)
- (%:>=) :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply (:>=$) t) t :: Bool)
- sMax :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply MaxSym0 t) t :: a)
- sMin :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply MinSym0 t) t :: a)
- type family ThenCmp a a :: Ordering
- sThenCmp :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply ThenCmpSym0 t) t :: Ordering)
- type family Foldl a a a :: b
- sFoldl :: forall t t t. Sing t -> Sing t -> Sing t -> Sing (Apply (Apply (Apply FoldlSym0 t) t) t :: b)
- type family Any :: k
- class (kparam ~ KProxy) => SDecide kparam where
- data a :~: b :: k -> k -> * where
- data Void :: *
- type Refuted a = a -> Void
- data Decision a
- data Proxy t :: k -> * = Proxy
- data KProxy t :: * -> * = KProxy
- data SomeSing kproxy where
- type family Error str :: k
- data ErrorSym0 l
- type TrueSym0 = True
- type FalseSym0 = False
- type LTSym0 = LT
- type EQSym0 = EQ
- type GTSym0 = GT
- type Tuple0Sym0 = `()`
- data Tuple2Sym0 l
- data Tuple2Sym1 l l
- type Tuple2Sym2 t t = `(t, t)`
- data Tuple3Sym0 l
- data Tuple3Sym1 l l
- data Tuple3Sym2 l l l
- type Tuple3Sym3 t t t = `(t, t, t)`
- data Tuple4Sym0 l
- data Tuple4Sym1 l l
- data Tuple4Sym2 l l l
- data Tuple4Sym3 l l l l
- type Tuple4Sym4 t t t t = `(t, t, t, t)`
- data Tuple5Sym0 l
- data Tuple5Sym1 l l
- data Tuple5Sym2 l l l
- data Tuple5Sym3 l l l l
- data Tuple5Sym4 l l l l l
- type Tuple5Sym5 t t t t t = `(t, t, t, t, t)`
- data Tuple6Sym0 l
- data Tuple6Sym1 l l
- data Tuple6Sym2 l l l
- data Tuple6Sym3 l l l l
- data Tuple6Sym4 l l l l l
- data Tuple6Sym5 l l l l l l
- type Tuple6Sym6 t t t t t t = `(t, t, t, t, t, t)`
- data Tuple7Sym0 l
- data Tuple7Sym1 l l
- data Tuple7Sym2 l l l
- data Tuple7Sym3 l l l l
- data Tuple7Sym4 l l l l l
- data Tuple7Sym5 l l l l l l
- data Tuple7Sym6 l l l l l l l
- type Tuple7Sym7 t t t t t t t = `(t, t, t, t, t, t, t)`
- data CompareSym0 l
- data ThenCmpSym0 l
- data FoldlSym0 l
- class SuppressUnusedWarnings t where
- suppressUnusedWarnings :: Proxy t -> ()
Primary Template Haskell generation functions
singletons :: DsMonad q => q [Dec] -> q [Dec] Source
Make promoted and singleton versions of all declarations given, retaining the original declarations. See http://www.cis.upenn.edu/~eir/packages/singletons/README.html for further explanation.
singletonsOnly :: DsMonad q => q [Dec] -> q [Dec] Source
Make promoted and singleton versions of all declarations given, discarding the original declarations. Note that a singleton based on a datatype needs the original datatype, so this will fail if it sees any datatype declarations. Classes, instances, and functions are all fine.
genSingletons :: DsMonad q => [Name] -> q [Dec] Source
Generate singleton definitions from a type that is already defined. For example, the singletons package itself uses
$(genSingletons [''Bool, ''Maybe, ''Either, ''[]])
to generate singletons for Prelude types.
promote :: DsMonad q => q [Dec] -> q [Dec] Source
Promote every declaration given to the type level, retaining the originals.
promoteOnly :: DsMonad q => q [Dec] -> q [Dec] Source
Promote each declaration, discarding the originals. Note that a promoted datatype uses the same definition as an original datatype, so this will not work with datatypes. Classes, instances, and functions are all fine.
genDefunSymbols :: DsMonad q => [Name] -> q [Dec] Source
Generate defunctionalization symbols for existing type family
genPromotions :: DsMonad q => [Name] -> q [Dec] Source
Generate promoted definitions from a type that is already defined. This is generally only useful with classes.
Functions to generate equality instances
promoteEqInstances :: DsMonad q => [Name] -> q [Dec] Source
Produce instances for '(:==)' (type-level equality) from the given types
promoteEqInstance :: DsMonad q => Name -> q [Dec] Source
Produce an instance for '(:==)' (type-level equality) from the given type
singEqInstances :: DsMonad q => [Name] -> q [Dec] Source
Create instances of SEq
and type-level '(:==)' for each type in the list
singEqInstance :: DsMonad q => Name -> q [Dec] Source
Create instance of SEq
and type-level '(:==)' for the given type
singEqInstancesOnly :: DsMonad q => [Name] -> q [Dec] Source
Create instances of SEq
(only -- no instance for '(:==)', which SEq
generally
relies on) for each type in the list
singEqInstanceOnly :: DsMonad q => Name -> q [Dec] Source
Create instances of SEq
(only -- no instance for '(:==)', which SEq
generally
relies on) for the given type
singDecideInstances :: DsMonad q => [Name] -> q [Dec] Source
Create instances of SDecide
for each type in the list.
singDecideInstance :: DsMonad q => Name -> q [Dec] Source
Create instance of SDecide
for the given type.
Functions to generate Ord
instances
promoteOrdInstances :: DsMonad q => [Name] -> q [Dec] Source
Produce instances for POrd
from the given types
promoteOrdInstance :: DsMonad q => Name -> q [Dec] Source
Produce an instance for POrd
from the given type
singOrdInstances :: DsMonad q => [Name] -> q [Dec] Source
Create instances of SOrd
for the given types
singOrdInstance :: DsMonad q => Name -> q [Dec] Source
Create instance of SOrd
for the given type
Functions to generate Bounded
instances
promoteBoundedInstances :: DsMonad q => [Name] -> q [Dec] Source
Produce instances for PBounded
from the given types
promoteBoundedInstance :: DsMonad q => Name -> q [Dec] Source
Produce an instance for PBounded
from the given type
singBoundedInstances :: DsMonad q => [Name] -> q [Dec] Source
Create instances of SBounded
for the given types
singBoundedInstance :: DsMonad q => Name -> q [Dec] Source
Create instance of SBounded
for the given type
Functions to generate Enum
instances
promoteEnumInstances :: DsMonad q => [Name] -> q [Dec] Source
Produce instances for PEnum
from the given types
promoteEnumInstance :: DsMonad q => Name -> q [Dec] Source
Produce an instance for PEnum
from the given type
singEnumInstances :: DsMonad q => [Name] -> q [Dec] Source
Create instances of SEnum
for the given types
singEnumInstance :: DsMonad q => Name -> q [Dec] Source
Create instance of SEnum
for the given type
Utility functions
:: DsMonad q | |
=> Name | The head of the type of the scrutinee. (Like |
-> q Exp | The scrutinee, in a Template Haskell quote |
-> q Exp | The body, in a Template Haskell quote |
-> q Exp |
The function cases
generates a case expression where each right-hand side
is identical. This may be useful if the type-checker requires knowledge of which
constructor is used to satisfy equality or type-class constraints, but where
each constructor is treated the same.
:: DsMonad q | |
=> Name | The head of the type the scrutinee's type is based on.
(Like |
-> q Exp | The scrutinee, in a Template Haskell quote |
-> q Exp | The body, in a Template Haskell quote |
-> q Exp |
The function sCases
generates a case expression where each right-hand side
is identical. This may be useful if the type-checker requires knowledge of which
constructor is used to satisfy equality or type-class constraints, but where
each constructor is treated the same. For sCases
, unlike cases
, the
scrutinee is a singleton. But make sure to pass in the name of the original
datatype, preferring ''Maybe
over ''SMaybe
.
Basic singleton definitions
The singleton kind-indexed data family.
data Sing Bool where Source | |
data Sing Ordering where Source | |
data Sing * where Source | |
data Sing Nat where Source | |
data Sing Symbol where
| |
data Sing () where Source | |
data Sing [a0] where Source | |
data Sing (Maybe a0) where Source | |
data Sing (TyFun k1 k2 -> *) = SLambda {} Source | |
data Sing (Either a0 b0) where Source | |
data Sing ((,) a0 b0) where Source | |
data Sing ((,,) a0 b0 c0) where Source | |
data Sing ((,,,) a0 b0 c0 d0) where Source | |
data Sing ((,,,,) a0 b0 c0 d0 e0) where Source | |
data Sing ((,,,,,) a0 b0 c0 d0 e0 f0) where Source | |
data Sing ((,,,,,,) a0 b0 c0 d0 e0 f0 g0) where Source |
module Data.Singletons
Auxiliary definitions
These definitions might be mentioned in code generated by Template Haskell, so they must be in scope.
class (kproxy ~ KProxy) => PEq kproxy Source
The promoted analogue of Eq
. If you supply no definition for '(:==)',
then it defaults to a use of '(==)', from Data.Type.Equality
.
PEq Bool (KProxy Bool) Source | |
PEq Ordering (KProxy Ordering) Source | |
PEq () (KProxy ()) Source | |
PEq [k] (KProxy [k]) Source | |
PEq (Maybe k) (KProxy (Maybe k)) Source | |
PEq (Either k k) (KProxy (Either k k)) Source | |
PEq ((,) k k) (KProxy ((,) k k)) Source | |
PEq ((,,) k k k) (KProxy ((,,) k k k)) Source | |
PEq ((,,,) k k k k) (KProxy ((,,,) k k k k)) Source | |
PEq ((,,,,) k k k k k) (KProxy ((,,,,) k k k k k)) Source | |
PEq ((,,,,,) k k k k k k) (KProxy ((,,,,,) k k k k k k)) Source | |
PEq ((,,,,,,) k k k k k k k) (KProxy ((,,,,,,) k k k k k k k)) Source |
class (kparam ~ KProxy) => SEq kparam where Source
The singleton analogue of Eq
. Unlike the definition for Eq
, it is required
that instances define a body for '(%:==)'. You may also supply a body for '(%:/=)'.
(%:==) :: forall a b. Sing a -> Sing b -> Sing (a :== b) infix 4 Source
Boolean equality on singletons
(%:/=) :: forall a b. Sing a -> Sing b -> Sing (a :/= b) infix 4 Source
Boolean disequality on singletons
SEq Bool (KProxy Bool) Source | |
SEq Ordering (KProxy Ordering) Source | |
SEq () (KProxy ()) Source | |
SEq a0 (KProxy a0) => SEq [a] (KProxy [a]) Source | |
SEq a0 (KProxy a0) => SEq (Maybe a) (KProxy (Maybe a)) Source | |
(SEq a0 (KProxy a0), SEq b0 (KProxy b0)) => SEq (Either a b) (KProxy (Either a b)) Source | |
(SEq a0 (KProxy a0), SEq b0 (KProxy b0)) => SEq ((,) a b) (KProxy ((,) a b)) Source | |
(SEq a0 (KProxy a0), SEq b0 (KProxy b0), SEq c0 (KProxy c0)) => SEq ((,,) a b c) (KProxy ((,,) a b c)) Source | |
(SEq a0 (KProxy a0), SEq b0 (KProxy b0), SEq c0 (KProxy c0), SEq d0 (KProxy d0)) => SEq ((,,,) a b c d) (KProxy ((,,,) a b c d)) Source | |
(SEq a0 (KProxy a0), SEq b0 (KProxy b0), SEq c0 (KProxy c0), SEq d0 (KProxy d0), SEq e0 (KProxy e0)) => SEq ((,,,,) a b c d e) (KProxy ((,,,,) a b c d e)) Source | |
(SEq a0 (KProxy a0), SEq b0 (KProxy b0), SEq c0 (KProxy c0), SEq d0 (KProxy d0), SEq e0 (KProxy e0), SEq f0 (KProxy f0)) => SEq ((,,,,,) a b c d e f) (KProxy ((,,,,,) a b c d e f)) Source | |
(SEq a0 (KProxy a0), SEq b0 (KProxy b0), SEq c0 (KProxy c0), SEq d0 (KProxy d0), SEq e0 (KProxy e0), SEq f0 (KProxy f0), SEq g0 (KProxy g0)) => SEq ((,,,,,,) a b c d e f g) (KProxy ((,,,,,,) a b c d e f g)) Source |
class (PEq (KProxy :: KProxy a), kproxy ~ KProxy) => POrd kproxy Source
type Compare arg arg :: Ordering Source
type arg :< arg :: Bool infix 4 Source
type arg :<= arg :: Bool infix 4 Source
type arg :> arg :: Bool infix 4 Source
POrd Bool (KProxy Bool) Source | |
POrd Ordering (KProxy Ordering) Source | |
POrd () (KProxy ()) Source | |
POrd [a] (KProxy [a]) Source | |
POrd (Maybe a) (KProxy (Maybe a)) Source | |
POrd (Either a b) (KProxy (Either a b)) Source | |
POrd ((,) a b) (KProxy ((,) a b)) Source | |
POrd ((,,) a b c) (KProxy ((,,) a b c)) Source | |
POrd ((,,,) a b c d) (KProxy ((,,,) a b c d)) Source | |
POrd ((,,,,) a b c d e) (KProxy ((,,,,) a b c d e)) Source | |
POrd ((,,,,,) a b c d e f) (KProxy ((,,,,,) a b c d e f)) Source | |
POrd ((,,,,,,) a b c d e f g) (KProxy ((,,,,,,) a b c d e f g)) Source |
class (SEq (KProxy :: KProxy a), kproxy ~ KProxy) => SOrd kproxy where Source
Nothing
sCompare :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply CompareSym0 t) t :: Ordering) Source
(%:<) :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply (:<$) t) t :: Bool) infix 4 Source
(%:<=) :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply (:<=$) t) t :: Bool) infix 4 Source
(%:>) :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply (:>$) t) t :: Bool) infix 4 Source
(%:>=) :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply (:>=$) t) t :: Bool) infix 4 Source
sMax :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply MaxSym0 t) t :: a) Source
sMin :: forall t t. Sing t -> Sing t -> Sing (Apply (Apply MinSym0 t) t :: a) Source
SOrd Bool (KProxy Bool) Source | |
SOrd Ordering (KProxy Ordering) Source | |
SOrd () (KProxy ()) Source | |
(SOrd a0 (KProxy a0), SOrd [a0] (KProxy [a0])) => SOrd [a] (KProxy [a]) Source | |
SOrd a0 (KProxy a0) => SOrd (Maybe a) (KProxy (Maybe a)) Source | |
(SOrd a0 (KProxy a0), SOrd b0 (KProxy b0)) => SOrd (Either a b) (KProxy (Either a b)) Source | |
(SOrd a0 (KProxy a0), SOrd b0 (KProxy b0)) => SOrd ((,) a b) (KProxy ((,) a b)) Source | |
(SOrd a0 (KProxy a0), SOrd b0 (KProxy b0), SOrd c0 (KProxy c0)) => SOrd ((,,) a b c) (KProxy ((,,) a b c)) Source | |
(SOrd a0 (KProxy a0), SOrd b0 (KProxy b0), SOrd c0 (KProxy c0), SOrd d0 (KProxy d0)) => SOrd ((,,,) a b c d) (KProxy ((,,,) a b c d)) Source | |
(SOrd a0 (KProxy a0), SOrd b0 (KProxy b0), SOrd c0 (KProxy c0), SOrd d0 (KProxy d0), SOrd e0 (KProxy e0)) => SOrd ((,,,,) a b c d e) (KProxy ((,,,,) a b c d e)) Source | |
(SOrd a0 (KProxy a0), SOrd b0 (KProxy b0), SOrd c0 (KProxy c0), SOrd d0 (KProxy d0), SOrd e0 (KProxy e0), SOrd f0 (KProxy f0)) => SOrd ((,,,,,) a b c d e f) (KProxy ((,,,,,) a b c d e f)) Source | |
(SOrd a0 (KProxy a0), SOrd b0 (KProxy b0), SOrd c0 (KProxy c0), SOrd d0 (KProxy d0), SOrd e0 (KProxy e0), SOrd f0 (KProxy f0), SOrd g0 (KProxy g0)) => SOrd ((,,,,,,) a b c d e f g) (KProxy ((,,,,,,) a b c d e f g)) Source |
sFoldl :: forall t t t. Sing t -> Sing t -> Sing t -> Sing (Apply (Apply (Apply FoldlSym0 t) t) t :: b) Source
type family Any :: k
The type constructor Any
is type to which you can unsafely coerce any
lifted type, and back.
- It is lifted, and hence represented by a pointer
- It does not claim to be a data type, and that's important for the code generator, because the code gen may enter a data value but never enters a function value.
It's also used to instantiate un-constrained type variables after type
checking. For example, length
has type
length :: forall a. [a] -> Int
and the list datacon for the empty list has type
[] :: forall a. [a]
In order to compose these two terms as length []
a type
application is required, but there is no constraint on the
choice. In this situation GHC uses Any
:
length (Any *) ([] (Any *))
Above, we print kinds explicitly, as if with
-fprint-explicit-kinds
.
Note that Any
is kind polymorphic; its kind is thus
forall k. k
.
data a :~: b :: k -> k -> * where infix 4
Propositional equality. If a :~: b
is inhabited by some terminating
value, then the type a
is the same as the type b
. To use this equality
in practice, pattern-match on the a :~: b
to get out the Refl
constructor;
in the body of the pattern-match, the compiler knows that a ~ b
.
Since: 4.7.0.0
data Void :: *
Uninhabited data type
Since: 4.8.0.0
A Decision
about a type a
is either a proof of existence or a proof that a
cannot exist.
data Proxy t :: k -> *
A concrete, poly-kinded proxy type
Monad (Proxy *) | |
Functor (Proxy *) | |
Applicative (Proxy *) | |
Foldable (Proxy *) | |
Traversable (Proxy *) | |
Bounded (Proxy k s) | |
Enum (Proxy k s) | |
Eq (Proxy k s) | |
Data t => Data (Proxy * t) | |
Ord (Proxy k s) | |
Read (Proxy k s) | |
Show (Proxy k s) | |
Ix (Proxy k s) | |
Generic (Proxy * t) | |
Monoid (Proxy k s) | |
type Rep (Proxy k t) = D1 D1Proxy (C1 C1_0Proxy U1) |
data KProxy t :: * -> *
A concrete, promotable proxy type, for use at the kind level There are no instances for this because it is intended at the kind level only
data SomeSing kproxy where Source
An existentially-quantified singleton. This type is useful when you want a singleton type, but there is no way of knowing, at compile-time, what the type index will be. To make use of this type, you will generally have to use a pattern-match:
foo :: Bool -> ... foo b = case toSing b of SomeSing sb -> {- fancy dependently-typed code with sb -}
An example like the one above may be easier to write using withSomeSing
.
type family Error str :: k Source
The promotion of error
. This version is more poly-kinded for
easier use.
type Tuple0Sym0 = `()` Source
data Tuple2Sym0 l Source
SuppressUnusedWarnings (TyFun k (TyFun k ((,) k k) -> *) -> *) (Tuple2Sym0 k k) Source | |
type Apply (TyFun k1 ((,) k k1) -> *) k (Tuple2Sym0 k k1) l0 = Tuple2Sym1 k k1 l0 Source |
data Tuple2Sym1 l l Source
SuppressUnusedWarnings (k -> TyFun k ((,) k k) -> *) (Tuple2Sym1 k k) Source | |
type Apply ((,) k1 k) k (Tuple2Sym1 k1 k l1) l0 = Tuple2Sym2 k1 k l1 l0 Source |
type Tuple2Sym2 t t = `(t, t)` Source
data Tuple3Sym0 l Source
SuppressUnusedWarnings (TyFun k (TyFun k (TyFun k ((,,) k k k) -> *) -> *) -> *) (Tuple3Sym0 k k k) Source | |
type Apply (TyFun k1 (TyFun k2 ((,,) k k1 k2) -> *) -> *) k (Tuple3Sym0 k k1 k2) l0 = Tuple3Sym1 k k1 k2 l0 Source |
data Tuple3Sym1 l l Source
SuppressUnusedWarnings (k -> TyFun k (TyFun k ((,,) k k k) -> *) -> *) (Tuple3Sym1 k k k) Source | |
type Apply (TyFun k1 ((,,) k2 k k1) -> *) k (Tuple3Sym1 k2 k k1 l1) l0 = Tuple3Sym2 k2 k k1 l1 l0 Source |
data Tuple3Sym2 l l l Source
SuppressUnusedWarnings (k -> k -> TyFun k ((,,) k k k) -> *) (Tuple3Sym2 k k k) Source | |
type Apply ((,,) k1 k2 k) k (Tuple3Sym2 k1 k2 k l1 l2) l0 = Tuple3Sym3 k1 k2 k l1 l2 l0 Source |
type Tuple3Sym3 t t t = `(t, t, t)` Source
data Tuple4Sym0 l Source
SuppressUnusedWarnings (TyFun k (TyFun k (TyFun k (TyFun k ((,,,) k k k k) -> *) -> *) -> *) -> *) (Tuple4Sym0 k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 ((,,,) k k1 k2 k3) -> *) -> *) -> *) k (Tuple4Sym0 k k1 k2 k3) l0 = Tuple4Sym1 k k1 k2 k3 l0 Source |
data Tuple4Sym1 l l Source
SuppressUnusedWarnings (k -> TyFun k (TyFun k (TyFun k ((,,,) k k k k) -> *) -> *) -> *) (Tuple4Sym1 k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 ((,,,) k3 k k1 k2) -> *) -> *) k (Tuple4Sym1 k3 k k1 k2 l1) l0 = Tuple4Sym2 k3 k k1 k2 l1 l0 Source |
data Tuple4Sym2 l l l Source
SuppressUnusedWarnings (k -> k -> TyFun k (TyFun k ((,,,) k k k k) -> *) -> *) (Tuple4Sym2 k k k k) Source | |
type Apply (TyFun k1 ((,,,) k2 k3 k k1) -> *) k (Tuple4Sym2 k2 k3 k k1 l1 l2) l0 = Tuple4Sym3 k2 k3 k k1 l1 l2 l0 Source |
data Tuple4Sym3 l l l l Source
SuppressUnusedWarnings (k -> k -> k -> TyFun k ((,,,) k k k k) -> *) (Tuple4Sym3 k k k k) Source | |
type Apply ((,,,) k1 k2 k3 k) k (Tuple4Sym3 k1 k2 k3 k l1 l2 l3) l0 = Tuple4Sym4 k1 k2 k3 k l1 l2 l3 l0 Source |
type Tuple4Sym4 t t t t = `(t, t, t, t)` Source
data Tuple5Sym0 l Source
SuppressUnusedWarnings (TyFun k (TyFun k (TyFun k (TyFun k (TyFun k ((,,,,) k k k k k) -> *) -> *) -> *) -> *) -> *) (Tuple5Sym0 k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 (TyFun k4 ((,,,,) k k1 k2 k3 k4) -> *) -> *) -> *) -> *) k (Tuple5Sym0 k k1 k2 k3 k4) l0 = Tuple5Sym1 k k1 k2 k3 k4 l0 Source |
data Tuple5Sym1 l l Source
SuppressUnusedWarnings (k -> TyFun k (TyFun k (TyFun k (TyFun k ((,,,,) k k k k k) -> *) -> *) -> *) -> *) (Tuple5Sym1 k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 ((,,,,) k4 k k1 k2 k3) -> *) -> *) -> *) k (Tuple5Sym1 k4 k k1 k2 k3 l1) l0 = Tuple5Sym2 k4 k k1 k2 k3 l1 l0 Source |
data Tuple5Sym2 l l l Source
SuppressUnusedWarnings (k -> k -> TyFun k (TyFun k (TyFun k ((,,,,) k k k k k) -> *) -> *) -> *) (Tuple5Sym2 k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 ((,,,,) k3 k4 k k1 k2) -> *) -> *) k (Tuple5Sym2 k3 k4 k k1 k2 l1 l2) l0 = Tuple5Sym3 k3 k4 k k1 k2 l1 l2 l0 Source |
data Tuple5Sym3 l l l l Source
SuppressUnusedWarnings (k -> k -> k -> TyFun k (TyFun k ((,,,,) k k k k k) -> *) -> *) (Tuple5Sym3 k k k k k) Source | |
type Apply (TyFun k1 ((,,,,) k2 k3 k4 k k1) -> *) k (Tuple5Sym3 k2 k3 k4 k k1 l1 l2 l3) l0 = Tuple5Sym4 k2 k3 k4 k k1 l1 l2 l3 l0 Source |
data Tuple5Sym4 l l l l l Source
SuppressUnusedWarnings (k -> k -> k -> k -> TyFun k ((,,,,) k k k k k) -> *) (Tuple5Sym4 k k k k k) Source | |
type Apply ((,,,,) k1 k2 k3 k4 k) k (Tuple5Sym4 k1 k2 k3 k4 k l1 l2 l3 l4) l0 = Tuple5Sym5 k1 k2 k3 k4 k l1 l2 l3 l4 l0 Source |
type Tuple5Sym5 t t t t t = `(t, t, t, t, t)` Source
data Tuple6Sym0 l Source
SuppressUnusedWarnings (TyFun k (TyFun k (TyFun k (TyFun k (TyFun k (TyFun k ((,,,,,) k k k k k k) -> *) -> *) -> *) -> *) -> *) -> *) (Tuple6Sym0 k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 (TyFun k4 (TyFun k5 ((,,,,,) k k1 k2 k3 k4 k5) -> *) -> *) -> *) -> *) -> *) k (Tuple6Sym0 k k1 k2 k3 k4 k5) l0 = Tuple6Sym1 k k1 k2 k3 k4 k5 l0 Source |
data Tuple6Sym1 l l Source
SuppressUnusedWarnings (k -> TyFun k (TyFun k (TyFun k (TyFun k (TyFun k ((,,,,,) k k k k k k) -> *) -> *) -> *) -> *) -> *) (Tuple6Sym1 k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 (TyFun k4 ((,,,,,) k5 k k1 k2 k3 k4) -> *) -> *) -> *) -> *) k (Tuple6Sym1 k5 k k1 k2 k3 k4 l1) l0 = Tuple6Sym2 k5 k k1 k2 k3 k4 l1 l0 Source |
data Tuple6Sym2 l l l Source
SuppressUnusedWarnings (k -> k -> TyFun k (TyFun k (TyFun k (TyFun k ((,,,,,) k k k k k k) -> *) -> *) -> *) -> *) (Tuple6Sym2 k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 ((,,,,,) k4 k5 k k1 k2 k3) -> *) -> *) -> *) k (Tuple6Sym2 k4 k5 k k1 k2 k3 l1 l2) l0 = Tuple6Sym3 k4 k5 k k1 k2 k3 l1 l2 l0 Source |
data Tuple6Sym3 l l l l Source
SuppressUnusedWarnings (k -> k -> k -> TyFun k (TyFun k (TyFun k ((,,,,,) k k k k k k) -> *) -> *) -> *) (Tuple6Sym3 k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 ((,,,,,) k3 k4 k5 k k1 k2) -> *) -> *) k (Tuple6Sym3 k3 k4 k5 k k1 k2 l1 l2 l3) l0 = Tuple6Sym4 k3 k4 k5 k k1 k2 l1 l2 l3 l0 Source |
data Tuple6Sym4 l l l l l Source
SuppressUnusedWarnings (k -> k -> k -> k -> TyFun k (TyFun k ((,,,,,) k k k k k k) -> *) -> *) (Tuple6Sym4 k k k k k k) Source | |
type Apply (TyFun k1 ((,,,,,) k2 k3 k4 k5 k k1) -> *) k (Tuple6Sym4 k2 k3 k4 k5 k k1 l1 l2 l3 l4) l0 = Tuple6Sym5 k2 k3 k4 k5 k k1 l1 l2 l3 l4 l0 Source |
data Tuple6Sym5 l l l l l l Source
SuppressUnusedWarnings (k -> k -> k -> k -> k -> TyFun k ((,,,,,) k k k k k k) -> *) (Tuple6Sym5 k k k k k k) Source | |
type Apply ((,,,,,) k1 k2 k3 k4 k5 k) k (Tuple6Sym5 k1 k2 k3 k4 k5 k l1 l2 l3 l4 l5) l0 = Tuple6Sym6 k1 k2 k3 k4 k5 k l1 l2 l3 l4 l5 l0 Source |
type Tuple6Sym6 t t t t t t = `(t, t, t, t, t, t)` Source
data Tuple7Sym0 l Source
SuppressUnusedWarnings (TyFun k (TyFun k (TyFun k (TyFun k (TyFun k (TyFun k (TyFun k ((,,,,,,) k k k k k k k) -> *) -> *) -> *) -> *) -> *) -> *) -> *) (Tuple7Sym0 k k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 (TyFun k4 (TyFun k5 (TyFun k6 ((,,,,,,) k k1 k2 k3 k4 k5 k6) -> *) -> *) -> *) -> *) -> *) -> *) k (Tuple7Sym0 k k1 k2 k3 k4 k5 k6) l0 = Tuple7Sym1 k k1 k2 k3 k4 k5 k6 l0 Source |
data Tuple7Sym1 l l Source
SuppressUnusedWarnings (k -> TyFun k (TyFun k (TyFun k (TyFun k (TyFun k (TyFun k ((,,,,,,) k k k k k k k) -> *) -> *) -> *) -> *) -> *) -> *) (Tuple7Sym1 k k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 (TyFun k4 (TyFun k5 ((,,,,,,) k6 k k1 k2 k3 k4 k5) -> *) -> *) -> *) -> *) -> *) k (Tuple7Sym1 k6 k k1 k2 k3 k4 k5 l1) l0 = Tuple7Sym2 k6 k k1 k2 k3 k4 k5 l1 l0 Source |
data Tuple7Sym2 l l l Source
SuppressUnusedWarnings (k -> k -> TyFun k (TyFun k (TyFun k (TyFun k (TyFun k ((,,,,,,) k k k k k k k) -> *) -> *) -> *) -> *) -> *) (Tuple7Sym2 k k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 (TyFun k4 ((,,,,,,) k5 k6 k k1 k2 k3 k4) -> *) -> *) -> *) -> *) k (Tuple7Sym2 k5 k6 k k1 k2 k3 k4 l1 l2) l0 = Tuple7Sym3 k5 k6 k k1 k2 k3 k4 l1 l2 l0 Source |
data Tuple7Sym3 l l l l Source
SuppressUnusedWarnings (k -> k -> k -> TyFun k (TyFun k (TyFun k (TyFun k ((,,,,,,) k k k k k k k) -> *) -> *) -> *) -> *) (Tuple7Sym3 k k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 (TyFun k3 ((,,,,,,) k4 k5 k6 k k1 k2 k3) -> *) -> *) -> *) k (Tuple7Sym3 k4 k5 k6 k k1 k2 k3 l1 l2 l3) l0 = Tuple7Sym4 k4 k5 k6 k k1 k2 k3 l1 l2 l3 l0 Source |
data Tuple7Sym4 l l l l l Source
SuppressUnusedWarnings (k -> k -> k -> k -> TyFun k (TyFun k (TyFun k ((,,,,,,) k k k k k k k) -> *) -> *) -> *) (Tuple7Sym4 k k k k k k k) Source | |
type Apply (TyFun k1 (TyFun k2 ((,,,,,,) k3 k4 k5 k6 k k1 k2) -> *) -> *) k (Tuple7Sym4 k3 k4 k5 k6 k k1 k2 l1 l2 l3 l4) l0 = Tuple7Sym5 k3 k4 k5 k6 k k1 k2 l1 l2 l3 l4 l0 Source |
data Tuple7Sym5 l l l l l l Source
SuppressUnusedWarnings (k -> k -> k -> k -> k -> TyFun k (TyFun k ((,,,,,,) k k k k k k k) -> *) -> *) (Tuple7Sym5 k k k k k k k) Source | |
type Apply (TyFun k1 ((,,,,,,) k2 k3 k4 k5 k6 k k1) -> *) k (Tuple7Sym5 k2 k3 k4 k5 k6 k k1 l1 l2 l3 l4 l5) l0 = Tuple7Sym6 k2 k3 k4 k5 k6 k k1 l1 l2 l3 l4 l5 l0 Source |
data Tuple7Sym6 l l l l l l l Source
SuppressUnusedWarnings (k -> k -> k -> k -> k -> k -> TyFun k ((,,,,,,) k k k k k k k) -> *) (Tuple7Sym6 k k k k k k k) Source | |
type Apply ((,,,,,,) k1 k2 k3 k4 k5 k6 k) k (Tuple7Sym6 k1 k2 k3 k4 k5 k6 k l1 l2 l3 l4 l5 l6) l0 = Tuple7Sym7 k1 k2 k3 k4 k5 k6 k l1 l2 l3 l4 l5 l6 l0 Source |
type Tuple7Sym7 t t t t t t t = `(t, t, t, t, t, t, t)` Source
data CompareSym0 l Source
SuppressUnusedWarnings (TyFun k (TyFun k Ordering -> *) -> *) (CompareSym0 k) Source | |
type Apply (TyFun k Ordering -> *) k (CompareSym0 k) l0 = CompareSym1 k l0 Source |
data ThenCmpSym0 l Source
SuppressUnusedWarnings (TyFun Ordering (TyFun Ordering Ordering -> *) -> *) ThenCmpSym0 Source | |
type Apply (TyFun Ordering Ordering -> *) Ordering ThenCmpSym0 l0 = ThenCmpSym1 l0 Source |
class SuppressUnusedWarnings t where Source
This class (which users should never see) is to be instantiated in order to use an otherwise-unused data constructor, such as the "kind-inference" data constructor for defunctionalization symbols.
suppressUnusedWarnings :: Proxy t -> () Source