{-# 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)