semiring-num-1.6.0.3: test/TypeLevel.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableSuperClasses #-}
module TypeLevel where
import Data.Proxy
import GHC.Exts
type family AllAre (c :: k -> Constraint) (xs :: [k]) :: Constraint where
AllAre c '[] = ()
AllAre c (x ': xs) = (c x, AllAre c xs)
class Reifiable (xs :: [k]) where
reify
:: AllAre c xs
=> Proxy c
-> Proxy xs
-> (forall a. c a =>
Proxy a -> b)
-> [b]
instance Reifiable '[] where
reify _ _ _ = []
instance Reifiable xs =>
Reifiable (x ': xs) where
reify p _ f = f (Proxy :: Proxy x) : reify p (Proxy :: Proxy xs) f
class (c a, d a) => (c & d) a where
instance (c a, d a) => (c & d) a