HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Moduletype-errors-0.2.0.2Haskell2010

Type.Errors

This module provides useful tools for writing better type-errors. For a quickstart guide to the underlying TypeError machinery, check out Dmitrii Kovanikov's excellent blog post A story told by Type Errors.

  • 9 types
  • 1 value

Generating Error Messages

3 declarations
familytype family PrettyPrintList (vs :: [k]) :: ErrorMessage where
#

Pretty print a list.

Example1 expression
:show_error PrettyPrintList '[Bool]...... 'Bool'...
Example1 expression
:show_error PrettyPrintList '[1, 2]...... '1', and '2'...
Example1 expression
:show_error PrettyPrintList '["hello", "world", "cool"]...... "hello", "world", and "cool"...

Emitting Error Messages

5 declarations
familytype family TypeError (a :: ErrorMessage) :: b where
#

The type-level equivalent of error.

The polymorphic kind of this type allows it to be used in several settings. For instance, it can be used as a constraint, e.g. to provide a better error message for a non-existent instance,

-- in a context
instance TypeError (Text "Cannot Show functions." :$$:
                    Text "Perhaps there is a missing argument?")
      => Show (a -> b) where
    showsPrec = error "unreachable"

It can also be placed on the right-hand side of a type-level function to provide an error for an invalid case,

type family ByteSize x where
   ByteSize Word16   = 2
   ByteSize Word8    = 1
   ByteSize a        = TypeError (Text "The type " :<>: ShowType a :<>:
                                  Text " is not exportable.")
typetype DelayError (err :: ErrorMessage) = Eval (DelayErrorFcf err)
#

Error messages produced via TypeError are often too strict, and will be emitted sooner than you'd like. The solution is to use DelayError, which will switch the error messages to being consumed lazily.

Example1 expression
:{foo :: TypeError ('Text "Too eager; prevents compilation") => ()foo = ():}...... Too eager; prevents compilation...
Example1 expression
:{foo :: DelayError ('Text "Lazy; emitted on use") => ()foo = ():}
Example1 expression
foo...... Lazy; emitted on use...
typetype NoError = ()
#

A helper definition that doesn't emit a type error. This is occassionally useful to leave as the residual constraint in IfStuck when you only want to observe if an expression isn't stuck.

Observing Stuckness

3 declarations
familytype family IfStuck (expr :: k) (b :: k1) (c :: Exp k1) :: k1 where
#

IfStuck expr b c leaves b in the residual constraints whenever expr is stuck, otherwise it Evaluates c.

Often you want to leave a DelayError in b in order to report an error when expr is stuck.

The c parameter is a first-class family, which allows you to perform arbitrarily-complicated type-level computations whenever expr isn't stuck. For example, you might want to produce a typeclass Constraint here. Alternatively, you can nest calls to IfStuck in order to do subsequent processing.

This is a generalization of kcsongor's Break machinery described in detecting the undetectable.

Equations

  • IfStuck (_1 AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind AnythingOfAnyKind) b c = b
  • IfStuck a2 b c = Eval c
typetype WhenStuck (expr :: k) (b :: Constraint) = IfStuck expr b NoErrorFcf
#

Like IfStuck, but specialized to the case when you don't want to do anything if expr isn't stuck.

Example1 expression
:{observe_no_rep    :: WhenStuck         (Rep t)         (DelayError ('Text "No Rep instance for " ':<>: ShowTypeQuoted t))    => t    -> ()observe_no_rep _ = ():}
Example1 expression
observe_no_rep HasNoRep...... No Rep instance for 'HasNoRep'...
Example1 expression
observe_no_rep True()
typetype UnlessStuck (expr :: k) (c :: Exp Constraint) = IfStuck expr NoError c
#

Like IfStuck, but leaves no residual constraint when expr is stuck. This can be used to ensure an expression isn't stuck before analyzing it further.

See the example under UnlessPhantom for an example of this use-case.

Running Magic Stuck Type Families

1 declaration
valuete :: Q Type -> Q Type
#

This library provides tools for performing lexical substitutions over types. For example, the function UnlessPhantom asks you to mark phantom variables via PHANTOM.

Unfortunately, this substitution cannot reliably be performed via type families, since it will too often get stuck. Instead we provide te, which is capable of reasoning about types symbolically.

Any type which comes with the warning "This type family is always stuck." must be used in the context of te and the magic [t| quasiquoter. To illustrate, the following is stuck:

Example1 expression
:{foo :: SubstVar VAR Boolfoo = True:}...... Couldn't match expected type ...SubstVar VAR Bool...... with actual type ...Bool......

But running it via te makes everything work:

Example1 expression
:{foo :: $(te[t| SubstVar VAR Bool |])foo = True:}

If you don't want to think about when to use te, it's a no-op when used with everyday types:

Example1 expression
:{bar :: $(te[t| Bool |])bar = True:}

Observing Phantomness

2 declarations
familytype family PHANTOM :: k
#

This type family is always stuck. It must be used in the context of te.

A meta-variable for marking which argument should be a phantom when working with UnlessPhantom.

PHANTOM is polykinded and can be used in several settings.

See UnlessPhantom for examples.

familytype family UnlessPhantom :: k -> ErrorMessage -> Constraint
#

This type family is always stuck. It must be used in the context of te.

UnlessPhantom expr err determines if the type described by expr is phantom in the variables marked via PHANTOM. If it's not, it produces the error message err.

For example, consider the definition:

Example1 expression
:{data Qux a b = Qux b:}

which is phantom in a:

Example1 expression
:eval_error $(te[t| UnlessPhantom (Qux PHANTOM Int) ('Text "Ok") |])()

but not in b:

Example1 expression
:eval_error $(te[t| UnlessPhantom (Qux Int PHANTOM) ('Text "Bad!") |])...... Bad!...

Unfortunately there is no known way to emit an error message if the variable is a phantom.

Often you'll want to guard UnlessPhantom against IfStuck, to ensure you don't get errors when things are merely ambiguous. You can do this by writing your own fcf whose implementation is UnlessPhantom:

Example1 expression
:{data NotPhantomErrorFcf :: k -> Exp Constrainttype instance Eval (NotPhantomErrorFcf f) =  $(te[t| UnlessPhantom (f PHANTOM)                        ( ShowTypeQuoted f                   ':<>: 'Text " is not phantom in its argument!")        |]):}
Example1 expression
:{observe_phantom    :: UnlessStuck         f         (NotPhantomErrorFcf f)    => f p    -> ()observe_phantom _ = ():}

We then notice that using observe_phantom against Proxy doesn't produce any errors, but against Maybe does:

Example1 expression
observe_phantom Proxy()
Example1 expression
observe_phantom (Just 5)...... 'Maybe' is not phantom in its argument!...

Finally, we leave observe_phantom unsaturated, and therefore f isn't yet known. Without guarding the UnlessPhantom behind UnlessStuck, this would incorrectly produce the message "f is not phantom in its argument!"

Example1 expression
observe_phantom...

Performing Type Substitutions

3 declarations
familytype family Subst :: k1 -> k1 -> k2 -> k2
#

This type family is always stuck. It must be used in the context of te.

Subst expr a b substitutes all instances of a for b in expr.

Example1 expression
:kind! $(te[t| Subst (Either Int Int) Int Bool |])...= Either Bool Bool
Example1 expression
:kind! $(te[t| Subst (Either Int Bool) Int [Char] |])...= Either [Char] Bool
Example1 expression
:kind! $(te[t| Subst (Either Int Bool) Either (,) |])...= (Int, Bool)
familytype family VAR :: k
#

This type family is always stuck. It must be used in the context of te.

VAR is a meta-varaible which marks a substitution in SubstVar. The result of SubstVar expr val is expr[val/VAR].

VAR is polykinded and can be used in several settings.

See SubstVar for examples.

familytype family SubstVar :: k1 -> k2 -> k2
#

This type family is always stuck. It must be used in the context of te.

Like Subst, but uses the explicit meta-variable VAR to mark substitution points.

Example1 expression
:kind! $(te[t| SubstVar (Either VAR VAR) Bool |])...= Either Bool Bool
Example1 expression
:kind! $(te[t| SubstVar (Either VAR Bool) [Char] |])...= Either [Char] Bool
Example1 expression
:kind! $(te[t| SubstVar (VAR Int Bool) (,) |])...= (Int, Bool)

Working With Fcfs

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.

Instances191Eval, …
  • 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 (DelayErrorFcf a2) = TypeError a2Defined in type-errors-0.2.0.2 · Type.Errors
  • 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
datadata Pure (b :: a) (c :: a)
#
Instances1Eval
  • type Eval (Pure x) = xDefined in first-class-families-0.8.1.0 · Fcf.Combinators