According [type applications](https://gitlab.haskell.org/ghc/ghc/-/wikis/type-application), this extension `allows to give explicit type arguments to a polymorphic function`.

```haskell
type VestingSchema =
             Endpoint "give" GiveParams
         .\/ Endpoint "grab" ()
-- ...
endpoints :: Contract () VestingSchema Text ()
endpoints = awaitPromise (give' `select` grab') >> endpoints
   where
     give' = endpoint @"give" give
     grab' = endpoint @"grab" $ const grab
```

This does not allows to give values to a polymorphic function, so I have figured out that actually those "strings" at `@"give"` and `@"grab"` are actually something similar to types, because the type `Endpoint` has this type/kind signature:

```haskell
type Endpoint :: ghc-prim-0.6.1:GHC.Types.Symbol
                 -> * -> row-types-1.0.1.2:Data.Row.Internal.Row *
type Endpoint l a =
  l
  row-types-1.0.1.2:Data.Row.Internal..== (Wallet.Types.EndpointValue
                                             a,
                                           Plutus.Contract.Effects.ActiveEndpoint)
  :: row-types-1.0.1.2:Data.Row.Internal.Row *
        -- Defined in ‘Plutus.Contract.Request
```

So that `l` has kind `Symbol`. Why this is working with TypeApplications? Can I use this "give" and "grab" as type and/or type constructors anywhere in my code?