HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Modulefirst-class-families-0.8.1.0Haskell2010

Fcf

First-class type families

For example, here is a regular type family:

type family   FromMaybe (a :: k) (m :: Maybe k) :: k
type instance FromMaybe a 'Nothing  = a
type instance FromMaybe a ('Just b) = b

With Fcf, it translates to a data declaration:

data FromMaybe :: k -> Maybe k -> Exp k
type instance Eval (FromMaybe a 'Nothing)  = a
type instance Eval (FromMaybe a ('Just b)) = b
  • Fcfs can be higher-order.

  • The kind constructor Exp is a monad: there's (=<<) and Pure.

Essential language extensions for Fcf:

{-# LANGUAGE
    DataKinds,
    PolyKinds,
    TypeFamilies,
    TypeOperators,
    UndecidableInstances #-}
  • 67 types
  • 1 class

First-class type families

3 declarations
typetype Exp a = a -> Type
#

Kind of type-level expressions indexed by their result type.

familytype family Eval (e :: Exp a) :: a
#

Expression evaluator.

Instances190Eval, …
  • type Eval MEmpty_ = MEmptyDefined in first-class-families-0.8.1.0 · Fcf.Class.Monoid
  • type Eval (Bimap f g '(x, y)) = '(Eval (f x), Eval (g y))Defined in first-class-families-0.8.1.0 · Fcf.Class.Bifunctor
  • type Eval (Bimap f g ('Left x)) = 'Left (Eval (f x))Defined in first-class-families-0.8.1.0 · Fcf.Class.Bifunctor
  • type Eval (Bimap f g ('Right y)) = 'Right (Eval (g y))Defined in first-class-families-0.8.1.0 · Fcf.Class.Bifunctor
  • type Eval (First f2 x) = Eval (Bimap f2 Pure x)Defined in first-class-families-0.8.1.0 · Fcf.Class.Bifunctor
  • type Eval (Second g x) = Eval (Bimap Pure g x)Defined in first-class-families-0.8.1.0 · Fcf.Class.Bifunctor
  • type Eval (All p lst) = Eval (Foldr (Bicomap p Pure (&&)) 'True lst)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (And lst) = Eval (Foldr (&&) 'True lst)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Any p lst) = Eval (Foldr (Bicomap p Pure (||)) 'False lst)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Concat xs) = Eval (FoldMap Pure xs)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (ConcatMap f xs) = Eval (FoldMap f xs)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (FoldMap f 'Nothing) = MEmptyDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (FoldMap f '[]) = MEmptyDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (FoldMap f ('Left _a)) = MEmptyDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (FoldMap f ('Right x)) = Eval (f x)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (FoldMap f ('Just x)) = Eval (f x)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (FoldMap f (x ': xs)) = Eval (f x) <> Eval (FoldMap f xs)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y 'Nothing) = yDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y '[]) = yDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Left _a)) = yDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Right x)) = Eval (f x y)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Just x)) = Eval (f x y)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y (x ': xs)) = Eval (f x (Eval (Foldr f y xs)))Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Or lst) = Eval (Foldr (||) 'False lst)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Sum ns) = Eval (Foldr (+) 0 ns)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Map f 'Nothing) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, a2)) = '(x, Eval (f a2))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, y, a2)) = '(x, y, Eval (f a2))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, y, z, a2)) = '(x, y, z, Eval (f a2))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, y, z, w, a2)) = '(x, y, z, w, Eval (f a2))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f ('Left x)) = 'Left xDefined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f ('Right a3)) = 'Right (Eval (f a3))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f ('Just a3)) = 'Just (Eval (f a3))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f (a2 ': as)) = Eval (f a2) ': Eval (Map f as)Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Compare 'Nothing 'Nothing) = 'EQDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'Nothing ('Just _b)) = 'LTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'EQ 'GT) = 'LTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'EQ 'LT) = 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'False 'True) = 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'GT 'EQ) = 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'GT 'LT) = 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'LT 'EQ) = 'LTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'LT 'GT) = 'LTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare 'True 'False) = 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare '(a3, a4) '(b1, b2)) = Eval (Compare a3 b1) <> Eval (Compare a4 b2)Defined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare '(a4, a5, a6) '(b1, b2, b3)) = (Eval (Compare a4 b1) <> Eval (Compare a5 b2)) <> Eval (Compare a6 b3)Defined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare '[] '[]) = 'EQDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare '[] (_y ': _ys)) = 'LTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare ('Left _a) ('Right _b)) = 'LTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare ('Left a2) ('Left b2)) = Eval (Compare a2 b2)Defined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare ('Right _a) ('Left _b)) = 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare ('Right a3) ('Right b)) = Eval (Compare a3 b)Defined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare ('Just _a) 'Nothing) = 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare ('Just a2) ('Just b)) = Eval (Compare a2 b)Defined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare (_x ': _xs) '[]) = 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare (x ': xs) (y ': ys)) = Eval (Compare x y) <> Eval (Compare xs ys)Defined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare a a) = 'EQDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare a a) = 'EQDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare a b) = CmpSymbol a bDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare a b) = CmpNat a bDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (Compare a b) = 'EQDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (ConstFn a2 _b) = a2Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (Flip f y x) = Eval (f x y)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (Join e) = Eval (Eval e)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (LiftM2 f x y) = Eval (f (Eval x) (Eval y))Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (LiftM3 f x y z) = Eval (f (Eval x) (Eval y) (Eval z))Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (Pure x) = xDefined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (Pure1 f x) = f xDefined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (Pure2 f x y) = f x yDefined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (Pure3 f x y z) = f x y zDefined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (Not 'False) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (Not 'True) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (UnBool fal tru 'False) = Eval falDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (UnBool fal tru 'True) = Eval truDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (FromMaybe _a ('Just b)) = bDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (FromMaybe a2 'Nothing) = a2Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (Fst '(a2, _b)) = a2Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (IsJust 'Nothing) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (IsJust ('Just _a)) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (IsLeft ('Left _a)) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (IsLeft ('Right _a)) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (IsNothing 'Nothing) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (IsNothing ('Just _a)) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (IsRight ('Left _a)) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (IsRight ('Right _a)) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (Snd '(_a, b)) = bDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (UnEither f g ('Left x)) = Eval (f x)Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (UnEither f g ('Right y)) = Eval (g y)Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (UnMaybe y f 'Nothing) = Eval yDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (UnMaybe y f ('Just x)) = Eval (f x)Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (Uncurry f '(x, y)) = Eval (f x y)Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (Bicomap f g r x y) = Eval (r (Eval (f x)) (Eval (g y)))Defined in first-class-families-0.8.1.0 · Fcf.Data.Function
  • type Eval (On r f x y) = Eval (r (Eval (f x)) (Eval (f y)))Defined in first-class-families-0.8.1.0 · Fcf.Data.Function
  • type Eval (Break p lst) = Eval (Span (Not <=< p) lst)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Cons a2 as) = a2 ': asDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Cons2 '(a3, b) '(as, bs)) = '(a3 ': as, b ': bs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Drop n as) = Drop_ n asDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (DropWhile p '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (DropWhile p (x ': xs)) = Eval (If (Eval (p x)) (DropWhile p xs) (Pure (x ': xs)))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Elem a2 as) = Eval (IsJust =<< FindIndex (TyEq a2) as)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Filter _p '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Filter p (a2 ': as)) = Eval (If (Eval (p a2)) ('(:) a2 <$> Filter p as) (Filter p as))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Find _p '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Find p (a2 ': as)) = Eval (If (Eval (p a2)) (Pure ('Just a2)) (Find p as))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (FindIndex _p '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (FindIndex p (a2 ': as)) = Eval (If (Eval (p a2)) (Pure ('Just 0)) (Map ((+) 1) =<< FindIndex p as))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Head '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Head (a2 ': _as)) = 'Just a2Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Init '[a2]) = 'Just '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Init '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Init (a2 ': b ': as)) = Eval (Map (Cons a2) =<< Init (b ': as))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Intercalate xs xss) = Eval (Concat =<< Intersperse xs xss)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Intersperse _1 '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Intersperse sep (x ': xs)) = x ': Eval (PrependToAll sep xs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (IsInfixOf xs ys) = Eval (Any (IsPrefixOf xs) =<< Tails ys)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (IsPrefixOf xs ys) = IsPrefixOf_ xs ysDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (IsSuffixOf xs ys) = Eval (IsPrefixOf (Reverse @@ xs) (Reverse @@ ys))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Last '[a2]) = 'Just a2Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Last '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Last (a2 ': b ': as)) = Eval (Last (b ': as))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Length '[]) = 0Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Length (a2 ': as)) = 1 + Eval (Length as)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Lookup a as) = Eval (Map Snd (Eval (Find (TyEq a <=< Fst) as)))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Null '[]) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Null (a2 ': as)) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (NumIter a s) = If (Eval (s > 0)) ('Just '(a, s - 1)) 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (PartHelp p a2 '(xs, ys)) = If (Eval (p a2)) '(a2 ': xs, ys) '(xs, a2 ': ys)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Partition p lst) = Eval (Foldr (PartHelp p) '('[], '[]) lst)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (PrependToAll _1 '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (PrependToAll sep (x ': xs)) = sep ': x ': Eval (PrependToAll sep xs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Replicate n a2) = Eval (Unfoldr (NumIter a2) n)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Rev '[] ys) = ysDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Rev (x ': xs) ys) = Eval (Rev xs (x ': ys))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Reverse l) = Eval (Rev l '[])Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (SetIndex n a' as) = SetIndexImpl n a' asDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Snoc lst a) = Eval (lst ++ '[a])Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Span p lst) = '(Eval (TakeWhile p lst), Eval (DropWhile p lst))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Tail '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Tail (_a ': as)) = 'Just asDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Tails '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Tails (a2 ': as)) = (a2 ': as) ': Eval (Tails as)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Take n as) = Take_ n asDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (TakeWhile p '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (TakeWhile p (x ': xs)) = Eval (If (Eval (p x)) ('(:) x <$> TakeWhile p xs) (Pure '[]))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (UnList y f xs) = Eval (Foldr f y xs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Unfoldr f c) = Eval (UnfoldrCase f (f @@ c))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (UnfoldrCase _1 'Nothing) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (UnfoldrCase f ('Just ab)) = Eval (Fst ab) ': Eval (Unfoldr f (Eval (Snd ab)))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Unzip as) = Eval (Foldr Cons2 '('[], '[]) (Eval as))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Zip as bs) = Eval (ZipWith (Pure2 '((,))) as bs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (ZipWith _f '[] _bs) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (ZipWith _f _as '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (ZipWith f (a2 ': as) (b2 ': bs)) = Eval (f a2 b2) ': Eval (ZipWith f as bs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Case ms a) = Case_ ms aDefined in first-class-families-0.8.1.0 · Fcf.Utils
  • type Eval (Constraints '[]) = ()Defined in first-class-families-0.8.1.0 · Fcf.Utils
  • type Eval (Constraints (a ': as)) = (a, Eval (Constraints as))Defined in first-class-families-0.8.1.0 · Fcf.Utils
  • type Eval (Error msg) = TypeError ('Text msg)Defined in first-class-families-0.8.1.0 · Fcf.Utils
  • type Eval (TError msg) = TypeError msgDefined in first-class-families-0.8.1.0 · Fcf.Utils
  • type Eval (TyEq a b) = TyEqImpl a bDefined in first-class-families-0.8.1.0 · Fcf.Utils
  • type Eval ('False && b) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval ('False || b) = bDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval ('True && b) = bDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval ('True || b) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval ((<=<) f g x) = Eval (f (Eval (g x)))Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval ((***) f f' '(b2, b'2)) = '(Eval (f b2), Eval (f' b'2))Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (a && 'False) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (a && 'True) = aDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (a || 'False) = aDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (a || 'True) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (a * b) = a * bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
  • type Eval (a + b) = a + bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
  • type Eval (a - b) = a - bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
  • type Eval (a < b) = Eval (Not =<< (a >= b))Defined in first-class-families-0.8.1.0 · Fcf.Data.Nat
  • type Eval (a <= b) = a <=? bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
  • type Eval (a > b) = Eval (Not =<< (a <= b))Defined in first-class-families-0.8.1.0 · Fcf.Data.Nat
  • type Eval (a >= b) = b <=? aDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
  • type Eval (a ^ b) = a ^ bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
  • type Eval (a2 < b) = Compare a2 b ~== 'LTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (a2 <= b) = Compare a2 b ~/= 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (a2 > b) = Compare a2 b ~== 'GTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (a2 >= b) = Compare a2 b ~/= 'LTDefined in first-class-families-0.8.1.0 · Fcf.Class.Ord
  • type Eval (e >>= k) = Eval (k (Eval e))Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (f $ a3) = Eval (f a3)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (f <$> e) = f (Eval e)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (f <*> e) = Eval f (Eval e)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (k =<< e) = Eval (k (Eval e))Defined in first-class-families-0.8.1.0 · Fcf.Combinators
  • type Eval (x .<> y) = x <> yDefined in first-class-families-0.8.1.0 · Fcf.Class.Monoid
  • type Eval (x & f) = Eval (f x)Defined in first-class-families-0.8.1.0 · Fcf.Data.Function
  • type Eval (xs ++ ys) = xs <> ysDefined in first-class-families-0.8.1.0 · Fcf.Data.List
typetype (@@) (f :: k1 -> Exp k) (x :: k1) = Eval (f x)
#

Apply and evaluate a unary type function.

Functional combinators

datadata Pure (b :: a) (c :: a)
#
Instances1Eval
  • type Eval (Pure x) = xDefined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata Pure1 (c :: a -> b) (d :: a) (e :: b)
#
Instances1Eval
  • type Eval (Pure1 f x) = f xDefined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata Pure2 (d :: a -> b -> c) (e :: a) (f :: b) (g :: c)
#
Instances1Eval
  • type Eval (Pure2 f x y) = f x yDefined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata Pure3 (e :: a -> b -> c -> d) (f :: a) (g :: b) (h :: c) (i :: d)
#
Instances1Eval
  • type Eval (Pure3 f x y z) = f x y zDefined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata (=<<) (c :: a -> Exp b) (d :: Exp a) (e :: b)
#
Instances1Eval
  • type Eval (k =<< e) = Eval (k (Eval e))Defined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata (<=<) (d :: b -> Exp c) (e :: a -> Exp b) (f :: a) (g :: c)
#
Instances1Eval
  • type Eval ((<=<) f g x) = Eval (f (Eval (g x)))Defined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata LiftM2 (d :: a -> b -> Exp c) (e :: Exp a) (f :: Exp b) (g :: c)
#
Instances1Eval
  • type Eval (LiftM2 f x y) = Eval (f (Eval x) (Eval y))Defined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata LiftM3 (e :: a -> b -> c -> Exp d) (f :: Exp a) (g :: Exp b) (h :: Exp c) (i :: d)
#
Instances1Eval
datadata Join (b :: Exp (Exp a)) (c :: a)
#
Instances1Eval
  • type Eval (Join e) = Eval (Eval e)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata (<$>) (c :: a -> b) (d :: Exp a) (e :: b)
#
Instances1Eval
  • type Eval (f <$> e) = f (Eval e)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata (<*>) (c :: Exp (a -> b)) (d :: Exp a) (e :: b)
#
Instances1Eval
  • type Eval (f <*> e) = Eval f (Eval e)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata Flip (d :: a -> b -> Exp c) (e :: b) (f :: a) (g :: c)
#
Instances1Eval
  • type Eval (Flip f y x) = Eval (f x y)Defined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata ConstFn (c :: a) (d :: b) (e :: a)
#
Instances1Eval
  • type Eval (ConstFn a2 _b) = a2Defined in first-class-families-0.8.1.0 · Fcf.Combinators
datadata ($) (c :: a -> Exp b) (d :: a) (e :: b)
#

Note that this denotes the identity function, so ($) f can usually be replaced with f.

Instances1Eval
  • type Eval (f $ a3) = Eval (f a3)Defined in first-class-families-0.8.1.0 · Fcf.Combinators

Operations on common types

0 declarations

Pairs

datadata Uncurry (d :: a -> b -> Exp c) (e :: (a, b)) (f :: c)
#
Instances1Eval
  • type Eval (Uncurry f '(x, y)) = Eval (f x y)Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
datadata Fst (c :: (a, b)) (d :: a)
#
Instances1Eval
  • type Eval (Fst '(a2, _b)) = a2Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
datadata Snd (c :: (a, b)) (d :: b)
#
Instances1Eval
  • type Eval (Snd '(_a, b)) = bDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
datadata (***) (a :: b -> Exp c) (d :: b' -> Exp c') (e :: (b, b')) (f :: (c, c'))
#

Specialization of Bimap for pairs.

Instances1Eval
  • type Eval ((***) f f' '(b2, b'2)) = '(Eval (f b2), Eval (f' b'2))Defined in first-class-families-0.8.1.0 · Fcf.Data.Common

Either

datadata UnEither (d :: a -> Exp c) (e :: b -> Exp c) (f :: Either a b) (g :: c)
#
Instances2Eval
  • type Eval (UnEither f g ('Left x)) = Eval (f x)Defined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (UnEither f g ('Right y)) = Eval (g y)Defined in first-class-families-0.8.1.0 · Fcf.Data.Common

Maybe

datadata FromMaybe (a :: k) (b :: Maybe k) (c :: k)
#
Instances2Eval
  • type Eval (FromMaybe _a ('Just b)) = bDefined in first-class-families-0.8.1.0 · Fcf.Data.Common
  • type Eval (FromMaybe a2 'Nothing) = a2Defined in first-class-families-0.8.1.0 · Fcf.Data.Common

Lists

datadata Foldr (c :: a -> b -> Exp b) (d :: b) (e :: t a) (f :: b)
#

Right fold.

Example
Example1 expression
:kind! Eval (Foldr (+) 0 [1, 2, 3, 4])Eval (Foldr (+) 0 [1, 2, 3, 4]) :: Natural= 10
Instances6Eval
  • type Eval (Foldr f y 'Nothing) = yDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y '[]) = yDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Left _a)) = yDefined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Right x)) = Eval (f x y)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Just x)) = Eval (f x y)Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y (x ': xs)) = Eval (f x (Eval (Foldr f y xs)))Defined in first-class-families-0.8.1.0 · Fcf.Class.Foldable
datadata UnList (c :: b) (d :: a -> b -> Exp b) (e :: [a]) (f :: b)
#

This is Foldr with its argument flipped.

Instances1Eval
  • type Eval (UnList y f xs) = Eval (Foldr f y xs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata (++) (b :: [a]) (c :: [a]) (d :: [a])
#

List catenation.

Example
Example2 expressions
data Example where Ex :: a -> Example  -- Hide the type of examples to avoid brittleness in different GHC versions:kind! Ex (Eval ([1, 2] ++ [3, 4]) :: [Natural])Ex (Eval ([1, 2] ++ [3, 4]) :: [Natural]) :: Example= Ex [1, 2, 3, 4]
Instances1Eval
  • type Eval (xs ++ ys) = xs <> ysDefined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata Filter (b :: a -> Exp Bool) (c :: [a]) (d :: [a])
#

Keep all elements that satisfy a predicate, remove all that don't.

Example
Example1 expression
:kind! Eval (Filter ((>) 3) [1,2,3,0])Eval (Filter ((>) 3) [1,2,3,0]) :: [Natural]= [1, 2, 0]
Instances2Eval
  • type Eval (Filter _p '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Filter p (a2 ': as)) = Eval (If (Eval (p a2)) ('(:) a2 <$> Filter p as) (Filter p as))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata Head (b :: [a]) (c :: Maybe a)
#
Instances2Eval
  • type Eval (Head '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Head (a2 ': _as)) = 'Just a2Defined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata Tail (b :: [a]) (c :: Maybe [a])
#
Instances2Eval
  • type Eval (Tail '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Tail (_a ': as)) = 'Just asDefined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata Null (b :: [a]) (c :: Bool)
#
Instances2Eval
  • type Eval (Null '[]) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Null (a2 ': as)) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata Length (b :: [a]) (c :: Nat)
#
Instances2Eval
  • type Eval (Length '[]) = 0Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Length (a2 ': as)) = 1 + Eval (Length as)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata Find (b :: a -> Exp Bool) (c :: [a]) (d :: Maybe a)
#

Find Just the first element satisfying a predicate, or evaluate to Nothing if no element satisfies the predicate.

Example
Example1 expression
:kind! Eval (Find (TyEq 0) [1,2,3])Eval (Find (TyEq 0) [1,2,3]) :: Maybe Natural= Nothing
Example1 expression
:kind! Eval (Find (TyEq 0) [1,2,3,0])Eval (Find (TyEq 0) [1,2,3,0]) :: Maybe Natural= Just 0
Instances2Eval
  • type Eval (Find _p '[]) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (Find p (a2 ': as)) = Eval (If (Eval (p a2)) (Pure ('Just a2)) (Find p as))Defined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata FindIndex (b :: a -> Exp Bool) (c :: [a]) (d :: Maybe Nat)
#

Find the index of an element satisfying the predicate.

Example
Example1 expression
:kind! Eval (FindIndex ((<=) 3) [1,2,3,1,2,3])Eval (FindIndex ((<=) 3) [1,2,3,1,2,3]) :: Maybe Natural= Just 2
Example1 expression
:kind! Eval (FindIndex ((>) 0) [1,2,3,1,2,3])Eval (FindIndex ((>) 0) [1,2,3,1,2,3]) :: Maybe Natural= Nothing
Instances2Eval
datadata Lookup (a :: k) (c :: [(k, b)]) (d :: Maybe b)
#

Find an element associated with a key in an association list.

Instances1Eval
datadata SetIndex (b :: Nat) (c :: a) (d :: [a]) (e :: [a])
#

Modify an element at a given index.

The list is unchanged if the index is out of bounds.

Example
Example1 expression
:kind! Eval (SetIndex 2 7 [1,2,3])Eval (SetIndex 2 7 [1,2,3]) :: [Natural]= [1, 2, 7]
Instances1Eval
  • type Eval (SetIndex n a' as) = SetIndexImpl n a' asDefined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata ZipWith (d :: a -> b -> Exp c) (e :: [a]) (f :: [b]) (g :: [c])
#

Combine elements of two lists pairwise.

Example
Example1 expression
:kind! Eval (ZipWith (+) [1,2,3] [1,1,1])Eval (ZipWith (+) [1,2,3] [1,1,1]) :: [Natural]= [2, 3, 4]
Instances3Eval
  • type Eval (ZipWith _f '[] _bs) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (ZipWith _f _as '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Data.List
  • type Eval (ZipWith f (a2 ': as) (b2 ': bs)) = Eval (f a2 b2) ': Eval (ZipWith f as bs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List
datadata Zip (c :: [a]) (d :: [b]) (e :: [(a, b)])
#
Instances1Eval
datadata Unzip (c :: Exp [(a, b)]) (d :: ([a], [b]))
#
Instances1Eval
datadata Cons2 (c :: (a, b)) (d :: ([a], [b])) (e :: ([a], [b]))
#

Append elements to two lists. Used in the definition of Unzip.

Instances1Eval
  • type Eval (Cons2 '(a3, b) '(as, bs)) = '(a3 ': as, b ': bs)Defined in first-class-families-0.8.1.0 · Fcf.Data.List

Bool

datadata UnBool (b :: Exp a) (c :: Exp a) (d :: Bool) (e :: a)
#

N.B.: The order of the two branches is the opposite of "if": UnBool ifFalse ifTrue bool.

This mirrors the default order of constructors:

data Bool = False | True
----------- False < True
Instances2Eval
  • type Eval (UnBool fal tru 'False) = Eval falDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (UnBool fal tru 'True) = Eval truDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
datadata (||) (a :: Bool) (b :: Bool) (c :: Bool)
#
Instances4Eval
  • type Eval ('False || b) = bDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval ('True || b) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (a || 'False) = aDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (a || 'True) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
datadata (&&) (a :: Bool) (b :: Bool) (c :: Bool)
#
Instances4Eval
  • type Eval ('False && b) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval ('True && b) = bDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (a && 'False) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (a && 'True) = aDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
datadata Not (a :: Bool) (b :: Bool)
#
Instances2Eval
  • type Eval (Not 'False) = 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool
  • type Eval (Not 'True) = 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Data.Bool

Case splitting

datadata Case (a :: [Match j k]) (b :: j) (c :: k)
#

(Limited) equivalent of \case { .. } syntax. Supports matching of exact values (-->) and final matches for any value (Any) or for passing value to subcomputation (Else). Examples:

type BoolToNat = Case
  [ 'True  --> 0
  , 'False --> 1
  ]

type NatToBool = Case
  [ 0 --> 'False
  , Any   'True
  ]

type ZeroOneOrSucc = Case
  [ 0  --> 0
  , 1  --> 1
  , Else   ((+) 1)
  ]
Instances1Eval
  • type Eval (Case ms a) = Case_ ms aDefined in first-class-families-0.8.1.0 · Fcf.Utils
typetype (-->) = 'Match_
#

Match concrete type in Case.

typetype Is = 'Is_
#

Match on predicate being successful with type in Case.

typetype Else = 'Else_
#

Pass type being matched in Case to subcomputation. Should be used as a final branch.

Nat

datadata (+) (a :: Nat) (b :: Nat) (c :: Nat)
#
Instances1Eval
  • type Eval (a + b) = a + bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
datadata (-) (a :: Nat) (b :: Nat) (c :: Nat)
#
Instances1Eval
  • type Eval (a - b) = a - bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
datadata (*) (a :: Nat) (b :: Nat) (c :: Nat)
#
Instances1Eval
  • type Eval (a * b) = a * bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
datadata (^) (a :: Nat) (b :: Nat) (c :: Nat)
#
Instances1Eval
  • type Eval (a ^ b) = a ^ bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
datadata (<=) (a :: Nat) (b :: Nat) (c :: Bool)
#
Instances1Eval
  • type Eval (a <= b) = a <=? bDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
datadata (>=) (a :: Nat) (b :: Nat) (c :: Bool)
#
Instances1Eval
  • type Eval (a >= b) = b <=? aDefined in first-class-families-0.8.1.0 · Fcf.Data.Nat
datadata (<) (a :: Nat) (b :: Nat) (c :: Bool)
#
Instances1Eval
  • type Eval (a < b) = Eval (Not =<< (a >= b))Defined in first-class-families-0.8.1.0 · Fcf.Data.Nat
datadata (>) (a :: Nat) (b :: Nat) (c :: Bool)
#
Instances1Eval
  • type Eval (a > b) = Eval (Not =<< (a <= b))Defined in first-class-families-0.8.1.0 · Fcf.Data.Nat

Overloaded operations

2 declarations
datadata Map (c :: a -> Exp b) (d :: f a) (e :: f b)
#

Type-level fmap for type-level functors.

Note: this name clashes with Data.Map.Lazy.Map from containers. FMap is provided as a synonym to avoid this.

Example
Example4 expressions
data Example where Ex :: a -> Example  -- Hide the type of examples to avoid brittleness in different GHC versionsdata AddMul :: Nat -> Nat -> Exp Nattype instance Eval (AddMul x y) = (x TL.+ y) TL.* (x TL.+ y):kind! Ex (Eval (Map (AddMul 2) '[0, 1, 2, 3, 4]) :: [Nat])Ex (Eval (Map (AddMul 2) '[0, 1, 2, 3, 4]) :: [Nat]) :: Example= Ex [4, 9, 16, 25, 36]
Instances10Eval, …
  • type Eval (Map f 'Nothing) = 'NothingDefined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, a2)) = '(x, Eval (f a2))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, y, a2)) = '(x, y, Eval (f a2))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, y, z, a2)) = '(x, y, z, Eval (f a2))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, y, z, w, a2)) = '(x, y, z, w, Eval (f a2))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f '[]) = '[]Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f ('Left x)) = 'Left xDefined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f ('Right a3)) = 'Right (Eval (f a3))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f ('Just a3)) = 'Just (Eval (f a3))Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
  • type Eval (Map f (a2 ': as)) = Eval (f a2) ': Eval (Map f as)Defined in first-class-families-0.8.1.0 · Fcf.Class.Functor
datadata Bimap (c :: a -> Exp a') (d :: b -> Exp b') (e :: f a b) (g :: f a' b')
#

Type-level bimap.

Example
Example2 expressions
data Example where Ex :: a -> Example  -- Hide the type of examples to avoid brittleness in different GHC versions:kind! Ex (Eval (Bimap ((+) 1) (Flip (-) 1) '(2, 4)) :: (Natural, Natural))Ex (Eval (Bimap ((+) 1) (Flip (-) 1) '(2, 4)) :: (Natural, Natural)) :: Example= Ex '(3, 3)
Instances3Eval
  • type Eval (Bimap f g '(x, y)) = '(Eval (f x), Eval (g y))Defined in first-class-families-0.8.1.0 · Fcf.Class.Bifunctor
  • type Eval (Bimap f g ('Left x)) = 'Left (Eval (f x))Defined in first-class-families-0.8.1.0 · Fcf.Class.Bifunctor
  • type Eval (Bimap f g ('Right y)) = 'Right (Eval (g y))Defined in first-class-families-0.8.1.0 · Fcf.Class.Bifunctor

Miscellaneous

6 declarations
datadata TyEq (c :: a) (d :: b) (e :: Bool)
#

Type equality.

Details

The base library also defines a similar (Type.Equality.==); it differs from TyEq in the following ways:

  • TyEq is heterogeneous: its arguments may have different kinds;

  • TyEq is reflexive: TyEq a a always reduces to True even if a is a variable.

Instances1Eval
  • type Eval (TyEq a b) = TyEqImpl a bDefined in first-class-families-0.8.1.0 · Fcf.Utils
familytype family Stuck :: a
#

A stuck type that can be used like a type-level undefined.

classclass IsBool (b :: Bool) where
#

Methods

Instances2IsBool
  • IsBool 'FalseDefined in first-class-families-0.8.1.0 · Fcf.Utils
  • IsBool 'TrueDefined in first-class-families-0.8.1.0 · Fcf.Utils
familytype family If (cond :: Bool) (tru :: k) (fls :: k) :: k where
#

Type-level If. If True a b ==> a; If False a b ==> b

Equations