HORIZON HASKELLDocslts/ghc-10.0.x8fef28d2026-11-02Search packagesCtrl K
Theme: |

GHC 10.0.0.20260917 · lts/ghc-10.0.x · 8fef28d · 2026-11-02

Modulefirst-class-families-0.8.2.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 #-}
Contents
  1. First-class type families
  2. Functional combinators
  3. Operations on common types
  4. Pairs
  5. Either
  6. Maybe
  7. Lists
  8. Bool
  9. Case splitting
  10. Nat
  11. Overloaded operations
  12. Miscellaneous
Synopsis

First-class type families

typetype Exp a = a -> Type

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

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

Expression evaluator.

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

Operations on common types

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.2.0 · Fcf.Data.Common
datadata Fst (c :: (a, b)) (d :: a)
#
Instances1Eval
  • type Eval (Fst '(a2, _b)) = a2Defined in first-class-families-0.8.2.0 · Fcf.Data.Common
datadata Snd (c :: (a, b)) (d :: b)
#
Instances1Eval
  • type Eval (Snd '(_a, b)) = bDefined in first-class-families-0.8.2.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.2.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.2.0 · Fcf.Data.Common
  • type Eval (UnEither f g ('Right y)) = Eval (g y)Defined in first-class-families-0.8.2.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.2.0 · Fcf.Data.Common
  • type Eval (FromMaybe a2 'Nothing) = a2Defined in first-class-families-0.8.2.0 · Fcf.Data.Common

Lists

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.2.0 · Fcf.Data.List
datadata Head (b :: [a]) (c :: Maybe a)
#
Instances2Eval
  • type Eval (Head '[]) = 'NothingDefined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Head (a2 ': _as)) = 'Just a2Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Last (b :: [a]) (c :: Maybe a)
#
Instances3Eval
  • type Eval (Last '[a2]) = 'Just a2Defined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Last '[]) = 'NothingDefined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Last (a2 ': b ': as)) = Eval (Last (b ': as))Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Tail (b :: [a]) (c :: Maybe [a])
#
Instances2Eval
  • type Eval (Tail '[]) = 'NothingDefined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Tail (_a ': as)) = 'Just asDefined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Cons (b :: a) (c :: [a]) (d :: [a])

Append an element to a list.

Example
Example2 expressions
:kind! Eval (Cons 1 [2, 3])Eval (Cons 1 [2, 3]) :: [Natural]= [1, 2, 3]:kind! Eval (Cons Int [Char, Maybe Double])Eval (Cons Int [Char, Maybe Double]) :: [*]= [Int, Char, Maybe Double]
Instances1Eval
  • type Eval (Cons a2 as) = a2 ': asDefined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Snoc (b :: [a]) (c :: a) (d :: [a])

Append an element to the end of a list.

Example
Example1 expression
:kind! Eval (Snoc [1,2,3] 4)Eval (Snoc [1,2,3] 4) :: [Natural]= [1, 2, 3, 4]
Instances1Eval
  • type Eval (Snoc lst a) = Eval (lst ++ '[a])Defined in first-class-families-0.8.2.0 · Fcf.Data.List
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.2.0 · Fcf.Data.List
datadata Init (b :: [a]) (c :: Maybe [a])
#
Instances3Eval
  • type Eval (Init '[a2]) = 'Just '[]Defined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Init '[]) = 'NothingDefined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Init (a2 ': b ': as)) = Eval (Map (Cons a2) =<< Init (b ': as))Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Uncons (b :: [a]) (c :: Maybe (a, [a]))
#
Instances2Eval
  • type Eval (Uncons '[]) = 'NothingDefined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Uncons (a ': xs)) = 'Just '(a, xs)Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Unsnoc (b :: [a]) (c :: Maybe ([a], a))

Decompose a list into init and last

Example
Example1 expression
:kind! Eval (Unsnoc '[])Eval (Unsnoc '[]) :: Maybe ([a], a)= Nothing
Example1 expression
:kind! Eval (Unsnoc '[1])Eval (Unsnoc '[1]) :: Maybe ([Natural], Natural)= Just '( '[], 1)
Example1 expression
:kind! Eval (Unsnoc '[1,2,3])Eval (Unsnoc '[1,2,3]) :: Maybe ([Natural], Natural)= Just '([1, 2], 3)
Instances3Eval
  • type Eval (Unsnoc '[x]) = 'Just '('[], x)Defined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Unsnoc '[]) = 'NothingDefined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Unsnoc (x ': y ': ys)) = Eval (Map (PrependF x) =<< Unsnoc (y ': ys))Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Singleton (b :: a) (c :: [a])
#
Instances1Eval
  • type Eval (Singleton x) = '[x]Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Null (b :: [a]) (c :: Bool)
#
Instances2Eval
  • type Eval (Null '[]) = 'TrueDefined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Null (a2 ': as)) = 'FalseDefined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Length (b :: [a]) (c :: Nat)
#
Instances2Eval
  • type Eval (Length '[]) = 0Defined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Length (a2 ': as)) = 1 + Eval (Length as)Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Reverse (b :: [a]) (c :: [a])

Reverse a list.

Example
Example1 expression
:kind! Eval (Reverse [1,2,3,4,5])Eval (Reverse [1,2,3,4,5]) :: [Natural]= [5, 4, 3, 2, 1]
Instances1Eval
  • type Eval (Reverse l) = Eval (Rev l '[])Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Intersperse (b :: a) (c :: [a]) (d :: [a])

Intersperse a separator between elements of a list.

Example
Example1 expression
:kind! Eval (Intersperse 0 [1,2,3,4])Eval (Intersperse 0 [1,2,3,4]) :: [Natural]= [1, 0, 2, 0, 3, 0, 4]
Instances2Eval
  • type Eval (Intersperse _1 '[]) = '[]Defined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Intersperse sep (x ': xs)) = x ': Eval (PrependToAll sep xs)Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Intercalate (b :: [a]) (c :: [[a]]) (d :: [a])

Join a list of words separated by some word.

Example
Example1 expression
:kind! Eval (Intercalate '[", "] [ '["Lorem"], '["ipsum"], '["dolor"] ])Eval (Intercalate '[", "] [ '["Lorem"], '["ipsum"], '["dolor"] ]) :: [TL.Symbol]= ["Lorem", ", ", "ipsum", ", ", "dolor"]
Instances1Eval
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.2.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y '[]) = yDefined in first-class-families-0.8.2.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Left _a)) = yDefined in first-class-families-0.8.2.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Right x)) = Eval (f x y)Defined in first-class-families-0.8.2.0 · Fcf.Class.Foldable
  • type Eval (Foldr f y ('Just x)) = Eval (f x y)Defined in first-class-families-0.8.2.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.2.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.2.0 · Fcf.Data.List
datadata Concat (a :: t m) (b :: m)

Concatenate a collection of elements from a monoid.

Example

For example, fold a list of lists.

Concat :: [[a]] -> Exp [a]
Example2 expressions
:kind! Eval (Concat ([[1,2], [3,4], [5,6]]))Eval (Concat ([[1,2], [3,4], [5,6]])) :: [Natural]= [1, 2, 3, 4, 5, 6]:kind! Eval (Concat ([[Int, Maybe Int], [Maybe String, Either Double Int]]))Eval (Concat ([[Int, Maybe Int], [Maybe String, Either Double Int]])) :: [*]= [Int, Maybe Int, Maybe [Char], Either Double Int]
Instances1Eval
datadata ConcatMap (c :: a -> Exp [b]) (d :: t a) (e :: [b])

Map a function and concatenate the results.

This is FoldMap specialized to the list monoid.

Instances1Eval
datadata Unfoldr (c :: b -> Exp (Maybe (a, b))) (d :: b) (e :: [a])

Unfold a generator into a list.

Example
Example2 expressions
data ToThree :: Nat -> Exp (Maybe (Nat, Nat)):{type instance Eval (ToThree b) =  If (4 TL.<=? b)    Nothing    (Just '(b, b TL.+ 1)):}
Example1 expression
:kind! Eval (Unfoldr ToThree 0)Eval (Unfoldr ToThree 0) :: [Natural]= [0, 1, 2, 3]

See also the definition of Replicate.

Instances1Eval
  • type Eval (Unfoldr f c) = Eval (UnfoldrCase f (f @@ c))Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Replicate (b :: Nat) (c :: a) (d :: [a])

Repeat the same element in a list.

Example
Example1 expression
:kind! Eval (Replicate 4 '("ok", 2))Eval (Replicate 4 '("ok", 2)) :: [(TL.Symbol, Natural)]= ['("ok", 2), '("ok", 2), '("ok", 2), '("ok", 2)]
Instances1Eval
datadata Take (b :: Nat) (c :: [a]) (d :: [a])

Take a prefix of fixed length.

Example
Example1 expression
:kind! Eval (Take 2 [1,2,3,4,5])Eval (Take 2 [1,2,3,4,5]) :: [Natural]= [1, 2]
Instances1Eval
  • type Eval (Take n as) = Take_ n asDefined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata Drop (b :: Nat) (c :: [a]) (d :: [a])

Drop a prefix of fixed length, evaluate to the remaining suffix.

Example
Example1 expression
:kind! Eval (Drop 2 [1,2,3,4,5])Eval (Drop 2 [1,2,3,4,5]) :: [Natural]= [3, 4, 5]
Instances1Eval
  • type Eval (Drop n as) = Drop_ n asDefined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata SplitAt (b :: Nat) (c :: [a]) (d :: ([a], [a]))

Return a tuple where first element is xs prefix of length n and second element is the remainder of the list.

Example
Example1 expression
:kind! Eval (SplitAt 3 '[1,2,3,4,5])Eval (SplitAt 3 '[1,2,3,4,5]) :: ([Natural], [Natural])= '([1, 2, 3], [4, 5])
Instances1Eval
datadata TakeWhile (b :: a -> Exp Bool) (c :: [a]) (d :: [a])

Take the longest prefix of elements satisfying a predicate.

Example
Example1 expression
:kind! Eval (TakeWhile ((>=) 3) [1, 2, 3, 4, 5])Eval (TakeWhile ((>=) 3) [1, 2, 3, 4, 5]) :: [Natural]= [1, 2, 3]
Instances2Eval
datadata DropWhile (b :: a -> Exp Bool) (c :: [a]) (d :: [a])

Drop the longest prefix of elements satisfying a predicate, evaluate to the remaining suffix.

Example

:kind! Eval (DropWhile ((>=) 3) [1, 2, 3, 4, 5]) Eval (DropWhile ((>=) 3) [1, 2, 3, 4, 5]) :: [Natural] = [4, 5]

Instances2Eval
datadata Span (b :: a -> Exp Bool) (c :: [a]) (d :: ([a], [a]))

Span, applied to a predicate p and a list xs, returns a tuple: the first component is the longest prefix (possibly empty) of xs whose elements satisfy p; the second component is the remainder of the list.

See also TakeWhile, DropWhile, and Break.

Example
Example1 expression
:kind! Eval (Span (Flip (<) 3) [1,2,3,4,1,2])Eval (Span (Flip (<) 3) [1,2,3,4,1,2]) :: ([Natural], [Natural])= '([1, 2], [3, 4, 1, 2])
Example1 expression
:kind! Eval (Span (Flip (<) 9) [1,2,3])Eval (Span (Flip (<) 9) [1,2,3]) :: ([Natural], [Natural])= '([1, 2, 3], '[])
Example1 expression
:kind! Eval (Span (Flip (<) 0) [1,2,3])Eval (Span (Flip (<) 0) [1,2,3]) :: ([Natural], [Natural])= '( '[], [1, 2, 3])
Instances1Eval
datadata Break (b :: a -> Exp Bool) (c :: [a]) (d :: ([a], [a]))

Break, applied to a predicate p and a list xs, returns a tuple: the first component is the longest prefix (possibly empty) of xs whose elements do not satisfy p; the second component is the remainder of the list.

Example
Example1 expression
:kind! Eval (Break (Flip (>) 3) [1,2,3,4,1,2])Eval (Break (Flip (>) 3) [1,2,3,4,1,2]) :: ([Natural], [Natural])= '([1, 2, 3], [4, 1, 2])
Example1 expression
:kind! Eval (Break (Flip (<) 9) [1,2,3])Eval (Break (Flip (<) 9) [1,2,3]) :: ([Natural], [Natural])= '( '[], [1, 2, 3])
Example1 expression
:kind! Eval (Break (Flip (>) 9) [1,2,3])Eval (Break (Flip (>) 9) [1,2,3]) :: ([Natural], [Natural])= '([1, 2, 3], '[])
Instances1Eval
datadata Tails (b :: [a]) (c :: [[a]])

List of suffixes of a list.

Example
Example1 expression
:kind! Eval (Tails [0,1,2,3])Eval (Tails [0,1,2,3]) :: [[Natural]]= [[0, 1, 2, 3], [1, 2, 3], [2, 3], '[3]]
Instances2Eval
  • type Eval (Tails '[]) = '[]Defined in first-class-families-0.8.2.0 · Fcf.Data.List
  • type Eval (Tails (a2 ': as)) = (a2 ': as) ': Eval (Tails as)Defined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata IsPrefixOf (b :: [a]) (c :: [a]) (d :: Bool)

Return True when the first list is a prefix of the second.

Example
Example1 expression
:kind! Eval ([0,1,2] `IsPrefixOf` [0,1,2,3,4,5])Eval ([0,1,2] `IsPrefixOf` [0,1,2,3,4,5]) :: Bool= True
Example1 expression
:kind! Eval ([0,1,2] `IsPrefixOf` [0,1,3,2,4,5])Eval ([0,1,2] `IsPrefixOf` [0,1,3,2,4,5]) :: Bool= False
Example1 expression
:kind! Eval ('[] `IsPrefixOf` [0,1,3,2,4,5])Eval ('[] `IsPrefixOf` [0,1,3,2,4,5]) :: Bool= True
Example1 expression
:kind! Eval ([0,1,3,2,4,5] `IsPrefixOf` '[])Eval ([0,1,3,2,4,5] `IsPrefixOf` '[]) :: Bool= False
Instances1Eval
  • type Eval (IsPrefixOf xs ys) = IsPrefixOf_ xs ysDefined in first-class-families-0.8.2.0 · Fcf.Data.List
datadata IsSuffixOf (b :: [a]) (c :: [a]) (d :: Bool)

Return True when the first list is a suffix of the second.

Example
Example1 expression
:kind! Eval (IsSuffixOf [3,4,5] [0,1,2,3,4,5])Eval (IsSuffixOf [3,4,5] [0,1,2,3,4,5]) :: Bool= True
Example1 expression
:kind! Eval (IsSuffixOf [3,4,5] [0,1,3,2,4,5])Eval (IsSuffixOf [3,4,5] [0,1,3,2,4,5]) :: Bool= False
Example1 expression
:kind! Eval (IsSuffixOf '[] [0,1,3,2,4,5])Eval (IsSuffixOf '[] [0,1,3,2,4,5]) :: Bool= True
Example1 expression
:kind! Eval (IsSuffixOf [0,1,3,2,4,5] '[])Eval (IsSuffixOf [0,1,3,2,4,5] '[]) :: Bool= False
Instances1Eval
datadata IsInfixOf (b :: [a]) (c :: [a]) (d :: Bool)

Return True when the first list is contained within the second.

Example
Example1 expression
:kind! Eval (IsInfixOf [2,3,4] [0,1,2,3,4,5,6])Eval (IsInfixOf [2,3,4] [0,1,2,3,4,5,6]) :: Bool= True
Example1 expression
:kind! Eval (IsInfixOf [2,4,4] [0,1,2,3,4,5,6])Eval (IsInfixOf [2,4,4] [0,1,2,3,4,5,6]) :: Bool= False
Instances1Eval
datadata Elem (b :: a) (c :: [a]) (d :: Bool)

Return True if an element is in a list.

See also FindIndex.

Example
Example2 expressions
:kind! Eval (Elem 1 [1,2,3])Eval (Elem 1 [1,2,3]) :: Bool= True:kind! Eval (Elem 1 [2,3])Eval (Elem 1 [2,3]) :: Bool= False
Instances1Eval
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.2.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.2.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.2.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.2.0 · Fcf.Data.List
datadata Partition (b :: a -> Exp Bool) (c :: [a]) (d :: ([a], [a]))

Split a list into one where all elements satisfy a predicate, and a second where no elements satisfy it.

Example
Example1 expression
:kind! Eval (Partition ((>=) 35) [20, 30, 40, 50])Eval (Partition ((>=) 35) [20, 30, 40, 50]) :: ([Natural],                                                [Natural])= '([20, 30], [40, 50])
Instances1Eval
  • type Eval (Partition p lst) = Eval (Foldr (PartHelp p) '('[], '[]) lst)Defined in first-class-families-0.8.2.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 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.2.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.2.0 · Fcf.Data.List
  • type Eval (ZipWith _f _as '[]) = '[]Defined in first-class-families-0.8.2.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.2.0 · Fcf.Data.List
datadata Zip (c :: [a]) (d :: [b]) (e :: [(a, b)])
#
Instances1Eval
datadata Unzip (c :: Exp [(a, b)]) (d :: ([a], [b]))
#
Instances1Eval

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.2.0 · Fcf.Data.Bool
  • type Eval (UnBool fal tru 'True) = Eval truDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
datadata (||) (a :: Bool) (b :: Bool) (c :: Bool)
#
Instances4Eval
  • type Eval ('False || b) = bDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
  • type Eval ('True || b) = 'TrueDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
  • type Eval (a || 'False) = aDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
  • type Eval (a || 'True) = 'TrueDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
datadata (&&) (a :: Bool) (b :: Bool) (c :: Bool)
#
Instances4Eval
  • type Eval ('False && b) = 'FalseDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
  • type Eval ('True && b) = bDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
  • type Eval (a && 'False) = 'FalseDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
  • type Eval (a && 'True) = aDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
datadata Not (a :: Bool) (b :: Bool)
#
Instances2Eval
  • type Eval (Not 'False) = 'TrueDefined in first-class-families-0.8.2.0 · Fcf.Data.Bool
  • type Eval (Not 'True) = 'FalseDefined in first-class-families-0.8.2.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.2.0 · Fcf.Utils
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.2.0 · Fcf.Data.Nat
datadata (-) (a :: Nat) (b :: Nat) (c :: Nat)
#
Instances1Eval
  • type Eval (a - b) = a - bDefined in first-class-families-0.8.2.0 · Fcf.Data.Nat
datadata (*) (a :: Nat) (b :: Nat) (c :: Nat)
#
Instances1Eval
  • type Eval (a * b) = a * bDefined in first-class-families-0.8.2.0 · Fcf.Data.Nat
datadata (^) (a :: Nat) (b :: Nat) (c :: Nat)
#
Instances1Eval
  • type Eval (a ^ b) = a ^ bDefined in first-class-families-0.8.2.0 · Fcf.Data.Nat
datadata (<=) (a :: Nat) (b :: Nat) (c :: Bool)
#
Instances1Eval
  • type Eval (a <= b) = a <=? bDefined in first-class-families-0.8.2.0 · Fcf.Data.Nat
datadata (>=) (a :: Nat) (b :: Nat) (c :: Bool)
#
Instances1Eval
  • type Eval (a >= b) = b <=? aDefined in first-class-families-0.8.2.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.2.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.2.0 · Fcf.Data.Nat

Overloaded operations

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.2.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, a2)) = '(x, Eval (f a2))Defined in first-class-families-0.8.2.0 · Fcf.Class.Functor
  • type Eval (Map f '(x, y, a2)) = '(x, y, Eval (f a2))Defined in first-class-families-0.8.2.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.2.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.2.0 · Fcf.Class.Functor
  • type Eval (Map f '[]) = '[]Defined in first-class-families-0.8.2.0 · Fcf.Class.Functor
  • type Eval (Map f ('Left x)) = 'Left xDefined in first-class-families-0.8.2.0 · Fcf.Class.Functor
  • type Eval (Map f ('Right a3)) = 'Right (Eval (f a3))Defined in first-class-families-0.8.2.0 · Fcf.Class.Functor
  • type Eval (Map f ('Just a3)) = 'Just (Eval (f a3))Defined in first-class-families-0.8.2.0 · Fcf.Class.Functor
  • type Eval (Map f (a2 ': as)) = Eval (f a2) ': Eval (Map f as)Defined in first-class-families-0.8.2.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.2.0 · Fcf.Class.Bifunctor
  • type Eval (Bimap f g ('Left x)) = 'Left (Eval (f x))Defined in first-class-families-0.8.2.0 · Fcf.Class.Bifunctor
  • type Eval (Bimap f g ('Right y)) = 'Right (Eval (g y))Defined in first-class-families-0.8.2.0 · Fcf.Class.Bifunctor

Miscellaneous

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.2.0 · Fcf.Utils
classclass IsBool (b :: Bool) where
#

Methods

Instances2IsBool
  • IsBool 'FalseDefined in first-class-families-0.8.2.0 · Fcf.Utils
  • IsBool 'TrueDefined in first-class-families-0.8.2.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

datadata Assert (a :: ErrorMessage) (b :: Exp Bool) (c :: r) (d :: r)

A compile-time assert.

Raises the provided TypeError, whenever the condition evaluates to False.

Usage example: type ExampleAssertionFailure = Eval ( Pure '["foo", "bar"] >>= Length >>= Assert ('Text Assertion) (TyEq Int Void) )

Instances1Eval