-- | -- Module : Math.VectorSpace.MiscUtil.MultiConstraints -- Copyright : (c) Justus Sagemüller 2020 -- License : GPL v3 -- -- Maintainer : (@) jsag $ hvl.no -- Stability : experimental -- Portability : portable -- {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE UndecidableInstances #-} module Math.VectorSpace.MiscUtil.MultiConstraints ( SameScalar ) where import Data.VectorSpace import Data.Kind (Type) import GHC.Exts (Constraint) type family AllWithScalar (s :: Type) (c :: Type -> Constraint) (vs :: [Type]) :: Constraint where AllWithScalar s c '[] = () AllWithScalar s c (v ': vs) = (c v, Scalar v ~ s, AllWithScalar s c vs) type family SameScalar (c :: Type -> Constraint) (vs :: [Type]) :: Constraint where SameScalar c '[] = () SameScalar c (v ': vs) = (c v, AllWithScalar (Scalar v) c vs)