first-class-instances-1.0.0.0: First class typeclass instances
Safe HaskellNone
LanguageHaskell2010

FCI.Internal

Description

Core types. This module is internal and provides no guarantees about stability and safety of its interface. It is left visible only as an escape hatch.

Synopsis

Documentation

type family Dict c = (t :: Type) | t -> c Source #

Type family that maps a constraint to its first class representation - should be generally used instead of its concrete result for consistency.

Instances

Instances details
type Dict (Arrow a) Source # 
Instance details

Defined in FCI.Base

type Dict (Arrow a) = DictArrow a
type Dict (ArrowApply a) Source # 
Instance details

Defined in FCI.Base

type Dict (ArrowChoice a) Source # 
Instance details

Defined in FCI.Base

type Dict (ArrowLoop a) Source # 
Instance details

Defined in FCI.Base

type Dict (ArrowPlus a) Source # 
Instance details

Defined in FCI.Base

type Dict (ArrowZero a) Source # 
Instance details

Defined in FCI.Base

type Dict (MonadFail m) Source # 
Instance details

Defined in FCI.Base

type Dict (MonadFix m) Source # 
Instance details

Defined in FCI.Base

type Dict (Bifoldable p) Source # 
Instance details

Defined in FCI.Base

type Dict (Bifunctor p) Source # 
Instance details

Defined in FCI.Base

type Dict (Bitraversable t) Source # 
Instance details

Defined in FCI.Base

type Dict (Foldable t) Source # 
Instance details

Defined in FCI.Base

type Dict (Contravariant f) Source # 
Instance details

Defined in FCI.Base

type Dict (Traversable t) Source # 
Instance details

Defined in FCI.Base

type Dict (Storable a) Source # 
Instance details

Defined in FCI.Base

type Dict (Alternative f) Source # 
Instance details

Defined in FCI.Base

type Dict (Applicative f) Source # 
Instance details

Defined in FCI.Base

type Dict (Functor f) Source # 
Instance details

Defined in FCI.Base

type Dict (Functor f) = DictFunctor f
type Dict (Monad m) Source # 
Instance details

Defined in FCI.Base

type Dict (Monad m) = DictMonad m
type Dict (MonadPlus m) Source # 
Instance details

Defined in FCI.Base

type Dict (Monoid a) Source # 
Instance details

Defined in FCI.Base

type Dict (Monoid a) = DictMonoid a
type Dict (Semigroup a) Source # 
Instance details

Defined in FCI.Base

type Dict (Bits a) Source # 
Instance details

Defined in FCI.Base

type Dict (Bits a) = DictBits a
type Dict (FiniteBits b) Source # 
Instance details

Defined in FCI.Base

type Dict (Bounded a) Source # 
Instance details

Defined in FCI.Base

type Dict (Bounded a) = DictBounded a
type Dict (Enum a) Source # 
Instance details

Defined in FCI.Base

type Dict (Enum a) = DictEnum a
type Dict (Exception e) Source # 
Instance details

Defined in FCI.Base

type Dict (Floating a) Source # 
Instance details

Defined in FCI.Base

type Dict (RealFloat a) Source # 
Instance details

Defined in FCI.Base

type Dict (Ix a) Source # 
Instance details

Defined in FCI.Base

type Dict (Ix a) = DictIx a
type Dict (Num a) Source # 
Instance details

Defined in FCI.Base

type Dict (Num a) = DictNum a
type Dict (Read a) Source # 
Instance details

Defined in FCI.Base

type Dict (Read a) = DictRead a
type Dict (Fractional a) Source # 
Instance details

Defined in FCI.Base

type Dict (Integral a) Source # 
Instance details

Defined in FCI.Base

type Dict (Real a) Source # 
Instance details

Defined in FCI.Base

type Dict (Real a) = DictReal a
type Dict (RealFrac a) Source # 
Instance details

Defined in FCI.Base

type Dict (Show a) Source # 
Instance details

Defined in FCI.Base

type Dict (Show a) = DictShow a
type Dict (Eq a) Source # 
Instance details

Defined in FCI.Base

type Dict (Eq a) = DictEq a
type Dict (Ord a) Source # 
Instance details

Defined in FCI.Base

type Dict (Ord a) = DictOrd a
type Dict (Category cat) Source # 
Instance details

Defined in FCI.Base

type Dict (Category cat) = DictCategory cat

dict :: c => Dict c Source #

Reflect a constraint as a dictionary value.

You can use TypeApplications to make the constraint c explicit. Dict is injective, so c may be inferred sometimes.

(==>) :: Dict c -> (c => r) -> r infixr 0 Source #

Reify a dictionary to resolve a constraint required by the second operand.

For example, this lets us use + on a type that doesn't have a top-level Num instance.

>>> newtype Foo = Foo Int deriving Show
>>> (coerce (dict @(Num Int)) :: Dict (Num Foo)) ==> Foo 1 + Foo 2
Foo 3

This function is extremely unsafe. It breaks the global property that there is at most one instance for each constraint. For example, sets and maps in containers rely on that property to maintain their invariants.

Use at your own risk.