packages feed

indextype 0.2.0.0 → 0.2.1.0

raw patch · 4 files changed

+255/−4 lines, 4 files

Files

indextype.cabal view
@@ -1,5 +1,5 @@ name:                 indextype-version:              0.2.0.0+version:              0.2.1.0 synopsis: A series of type families and constraints for "indexable" types. description:   This package deals with types that can roughly be "indexed" at compile time by an integer.@@ -11,7 +11,7 @@ author:               Clinton Mead maintainer:           clintonmead@gmail.com category:             Control-license: MIT+license: BSD3 license-file: LICENSE copyright: Clinton Mead (2017) build-type:           Simple@@ -24,7 +24,14 @@   location: https://github.com/clintonmead/indextype.git  library-  exposed-modules:      Control.IndexT, Control.IndexT.Tuple, Control.IndexT.Function, Control.IndexT.Constructor+  exposed-modules:+    Control.IndexT,+    Control.IndexT.Tuple,+    Control.IndexT.Function,+    Control.IndexT.Constructor,+    Control.IndexT.TypeLevel,+    Control.IndexT.TypeLevel.Tuple+   build-depends:        base == 4.9.*   hs-source-dirs:       src   default-language:     Haskell2010
src/Control/IndexT/Constructor.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE KindSignatures #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE PolyKinds #-}  {-| This module provides a way to constrain types to be data constructors, much like@@ -32,7 +33,7 @@  the ith (zero based) parameter of the constructor with n parameters, i.e. @a_i@ -}-type family IndexC (n :: Nat) (i :: Nat) a+type family IndexC (n :: Nat) (i :: Nat) (a :: k1) = (r :: k2)  type instance IndexC 1 0 (_ a) = a type instance IndexC 2 0 (_ a _) = a
+ src/Control/IndexT/TypeLevel.hs view
@@ -0,0 +1,149 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE PolyKinds #-}++{-|+Module      : Control.IndexT+Copyright   : Clinton Mead, 2017+License     : BSD3+Maintainer  : clintonmead@gmail.com+Stability   : experimental+Portability : GHC++This module just has the 'Control.IndexT.IndexT' type extraction function but raised to type level+-}++module Control.IndexT.TypeLevel (+  IndexT+  ) where++import GHC.TypeLits (Nat)+import Data.Functor.Identity (Identity(Identity))++{-|+'Control.IndexT.IndexT' on polykinded type level tuples.++Note this currently is only defined on tuples.+-}+type family IndexT (i :: Nat) (a :: k) = (r :: k')+type instance IndexT 0 ('Identity a) = a+type instance IndexT 0 '(a, _) = a+type instance IndexT 1 '(_, a) = a+type instance IndexT 0 '(a, _, _) = a+type instance IndexT 1 '(_, a, _) = a+type instance IndexT 2 '(_, _, a) = a+type instance IndexT 0 '(a, _, _, _) = a+type instance IndexT 1 '(_, a, _, _) = a+type instance IndexT 2 '(_, _, a, _) = a+type instance IndexT 3 '(_, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _) = a+type instance IndexT 3 '(_, _, _, a, _) = a+type instance IndexT 4 '(_, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _) = a+type instance IndexT 5 '(_, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a, _) = a+type instance IndexT 7 '(_, _, _, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _) = a+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _) = a+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _) = a+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _) = a+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _) = a+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _) = a+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _) = a+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _) = a+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _) = a+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _, _) = a+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _, _) = a+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _, _) = a+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _, _) = a+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a, _) = a+type instance IndexT 11 '(_, _, _, _, _, _, _, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _, _, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _, _, _) = a+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _, _, _) = a+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _, _, _) = a+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _, _, _) = a+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a, _, _) = a+type instance IndexT 11 '(_, _, _, _, _, _, _, _, _, _, _, a, _) = a+type instance IndexT 12 '(_, _, _, _, _, _, _, _, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _, _, _, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _, _, _, _) = a+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _, _, _, _) = a+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _, _, _, _) = a+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _, _, _, _) = a+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a, _, _, _) = a+type instance IndexT 11 '(_, _, _, _, _, _, _, _, _, _, _, a, _, _) = a+type instance IndexT 12 '(_, _, _, _, _, _, _, _, _, _, _, _, a, _) = a+type instance IndexT 13 '(_, _, _, _, _, _, _, _, _, _, _, _, _, a) = a+type instance IndexT 0 '(a, _, _, _, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 1 '(_, a, _, _, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 2 '(_, _, a, _, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 3 '(_, _, _, a, _, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 4 '(_, _, _, _, a, _, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 5 '(_, _, _, _, _, a, _, _, _, _, _, _, _, _, _) = a+type instance IndexT 6 '(_, _, _, _, _, _, a, _, _, _, _, _, _, _, _) = a+type instance IndexT 7 '(_, _, _, _, _, _, _, a, _, _, _, _, _, _, _) = a+type instance IndexT 8 '(_, _, _, _, _, _, _, _, a, _, _, _, _, _, _) = a+type instance IndexT 9 '(_, _, _, _, _, _, _, _, _, a, _, _, _, _, _) = a+type instance IndexT 10 '(_, _, _, _, _, _, _, _, _, _, a, _, _, _, _) = a+type instance IndexT 11 '(_, _, _, _, _, _, _, _, _, _, _, a, _, _, _) = a+type instance IndexT 12 '(_, _, _, _, _, _, _, _, _, _, _, _, a, _, _) = a+type instance IndexT 13 '(_, _, _, _, _, _, _, _, _, _, _, _, _, a, _) = a+type instance IndexT 14 '(_, _, _, _, _, _, _, _, _, _, _, _, _, _, a) = a
+ src/Control/IndexT/TypeLevel/Tuple.hs view
@@ -0,0 +1,94 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE UndecidableSuperClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeOperators #-}+{-|+Type family and class definitions for dealing with tuples.++"Control.IndexT.Tuple" but with tuples raised to the type level and polykinded.+-}++module Control.IndexT.TypeLevel.Tuple (+  TupleConstraint,+  HomoTupleConstraint,+  IsTuple,+  IsHomoTuple+  )+where++import Control.IndexT.TypeLevel (IndexT)++import GHC.TypeLits (Nat)+import GHC.Exts (Constraint)+import Data.Functor.Identity (Identity(Identity))+import Data.Type.Equality (type (~~))+{-|+Type level version of 'Control.IndexT.TupleConstraint'+-}+type family TupleConstraint (n :: Nat) (a :: k) :: Constraint+type instance TupleConstraint 0 a = a ~~ '()+type instance TupleConstraint 2 a = a ~~ '(IndexT 0 a, IndexT 1 a)+type instance TupleConstraint 3 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a)+type instance TupleConstraint 4 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a)+type instance TupleConstraint 5 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a)+type instance TupleConstraint 6 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a)+type instance TupleConstraint 7 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a)+type instance TupleConstraint 8 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a)+type instance TupleConstraint 9 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a)+type instance TupleConstraint 10 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a)+type instance TupleConstraint 11 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a)+type instance TupleConstraint 12 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a, IndexT 11 a)+type instance TupleConstraint 13 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a, IndexT 11 a, IndexT 12 a)+type instance TupleConstraint 14 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a, IndexT 11 a, IndexT 12 a, IndexT 13 a)+type instance TupleConstraint 15 a = a ~~ '(IndexT 0 a, IndexT 1 a, IndexT 2 a, IndexT 3 a, IndexT 4 a, IndexT 5 a, IndexT 6 a, IndexT 7 a, IndexT 8 a, IndexT 9 a, IndexT 10 a, IndexT 11 a, IndexT 12 a, IndexT 13 a, IndexT 14 a)++++{-|+'HomoTupleConstraint' simply further constrains 'TupleConstraint' so that all the elements are the same.++So @HomoTupleConstraint 3 t@ basically says @t ~ (u,u,u)@ for some @u@,++(\"Homo\" is short for \"Homogeneous\". As in, all the same. Or like milk.)+-}+type family HomoTupleConstraint (n :: Nat) a :: Constraint+type instance HomoTupleConstraint 0 a = (TupleConstraint 0 a)+type instance HomoTupleConstraint 1 a = (TupleConstraint 1 a)+type instance HomoTupleConstraint 2 a = (TupleConstraint 2 a, IndexT 0 a ~ IndexT 1 a)+type instance HomoTupleConstraint 3 a = (TupleConstraint 3 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a)+type instance HomoTupleConstraint 4 a = (TupleConstraint 4 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a)+type instance HomoTupleConstraint 5 a = (TupleConstraint 5 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a)+type instance HomoTupleConstraint 6 a = (TupleConstraint 6 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a)+type instance HomoTupleConstraint 7 a = (TupleConstraint 7 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a)+type instance HomoTupleConstraint 8 a = (TupleConstraint 8 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a)+type instance HomoTupleConstraint 9 a = (TupleConstraint 9 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a)+type instance HomoTupleConstraint 10 a = (TupleConstraint 10 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a)+type instance HomoTupleConstraint 11 a = (TupleConstraint 11 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a)+type instance HomoTupleConstraint 12 a = (TupleConstraint 12 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a, IndexT 10 a ~ IndexT 11 a)+type instance HomoTupleConstraint 13 a = (TupleConstraint 13 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a, IndexT 10 a ~ IndexT 11 a, IndexT 11 a ~ IndexT 12 a)+type instance HomoTupleConstraint 14 a = (TupleConstraint 14 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a, IndexT 10 a ~ IndexT 11 a, IndexT 11 a ~ IndexT 12 a, IndexT 12 a ~ IndexT 13 a)+type instance HomoTupleConstraint 15 a = (TupleConstraint 15 a, IndexT 0 a ~ IndexT 1 a, IndexT 1 a ~ IndexT 2 a, IndexT 2 a ~ IndexT 3 a, IndexT 3 a ~ IndexT 4 a, IndexT 4 a ~ IndexT 5 a, IndexT 5 a ~ IndexT 6 a, IndexT 6 a ~ IndexT 7 a, IndexT 7 a ~ IndexT 8 a, IndexT 8 a ~ IndexT 9 a, IndexT 9 a ~ IndexT 10 a, IndexT 10 a ~ IndexT 11 a, IndexT 11 a ~ IndexT 12 a, IndexT 12 a ~ IndexT 13 a, IndexT 13 a ~ IndexT 14 a)++{-|+GHC does not allow you to partially apply type families (or any type declaration for that matter).+So if you have a type of @* -> Constraint@ you can't pass @TupleConstraint 2@, because 'TupleConstraint' is partially+applied and this is not allowed.++But you can partially apply classes.++So 'IsTuple' is basically the same as 'TupleConstraint' except that it's a class, not a type family.+-}+class (TupleConstraint n a) => IsTuple n a+instance (TupleConstraint n a) => IsTuple n a++{-|+The version of 'IsTuple' for homogenous tuples (i.e. all the same type).+-}+class (HomoTupleConstraint n a) => IsHomoTuple n a+instance (HomoTupleConstraint n a) => IsHomoTuple n a