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

Moduleservant-server-0.20.3.0Haskell2010

Servant.Server.Internal.Context

Synopsis
valuedescendIntoNamedContext
  1. :: HasContextEntry context (NamedContext name subContext)
  2. => Proxy name
  3. -> Context context
  4. -> Context subContext

descendIntoNamedContext allows you to access NamedContexts. Usually you won't have to use it yourself but instead use a combinator like WithNamedContext.

This is how descendIntoNamedContext works:

Example6 expressions
:set -XFlexibleContextslet subContext = True :. EmptyContext:type subContextsubContext :: Context '[Bool]let parentContext = False :. (NamedContext subContext :: NamedContext "subContext" '[Bool]) :. EmptyContext:type parentContextparentContext :: Context '[Bool, NamedContext "subContext" '[Bool]]descendIntoNamedContext (Proxy :: Proxy "subContext") parentContext :: Context '[Bool]True :. EmptyContext
datadata Context (contextTypes :: [Type]) where

Contexts are used to pass values to combinators. (They are not meant to be used to pass parameters to your handlers, i.e. they should not replace any custom ReaderT-monad-stack that you're using with hoistServer.) If you don't use combinators that require any context entries, you can just use serve as always.

If you are using combinators that require a non-empty Context you have to use serveWithContext and pass it a Context that contains all the values your combinators need. A Context is essentially a heterogeneous list and accessing the elements is being done by type (see getContextEntry). The parameter of the type Context is a type-level list reflecting the types of the contained context entries. To create a Context with entries, use the operator (:.):

Example1 expression
:type True :. () :. EmptyContextTrue :. () :. EmptyContext :: Context '[Bool, ()]

Constructors

Instances4Eq, Show
  • Eq (Context '[])Defined in servant-server-0.20.3.0 · Servant.Server.Internal.Context
  • (Eq a, Eq (Context as)) => Eq (Context (a ': as))Defined in servant-server-0.20.3.0 · Servant.Server.Internal.Context
  • Show (Context '[])Defined in servant-server-0.20.3.0 · Servant.Server.Internal.Context
  • (Show a, Show (Context as)) => Show (Context (a ': as))Defined in servant-server-0.20.3.0 · Servant.Server.Internal.Context
classclass HasContextEntry (context :: [Type]) val where

This class is used to access context entries in Contexts. getContextEntry returns the first value where the type matches:

Example1 expression
getContextEntry (True :. False :. EmptyContext) :: BoolTrue

If the Context does not contain an entry of the requested type, you'll get an error:

Example1 expression
getContextEntry (True :. False :. EmptyContext) :: String......No instance for ...HasContextEntry '[] [Char]......

Methods

Instances2HasContextEntry
  • HasContextEntry (val ': xs) valDefined in servant-server-0.20.3.0 · Servant.Server.Internal.Context
  • HasContextEntry xs val => HasContextEntry (notIt ': xs) valDefined in servant-server-0.20.3.0 · Servant.Server.Internal.Context
familytype family (.++) (l1 :: [Type]) (l2 :: [Type]) :: [Type] where

Append two type-level lists.

Import it as

import Servant.API.TypeLevel.List (type (.++))

Equations

  • (.++) '[] a = a
  • (.++) (a ': as) b = a ': as .++ b