The class of representable datatypes.
The SOP approach to generic programming is based on viewing datatypes as a representation (Rep) built from the sum of products of its components. The components of a datatype are specified using the Code type family.
The isomorphism between the original Haskell datatype and its representation is witnessed by the methods of this class, from and to. So for instances of this class, the following laws should (in general) hold:
to . from === id :: a -> a
from . to === id :: Rep a -> Rep a
You typically don't define instances of this class by hand, but rather derive the class instance automatically.
Option 1: Derive via the built-in GHC-generics. For this, you
need to use the DeriveGeneric extension to first derive an
instance of the Generic class from module GHC.Generics.
With this, you can then give an empty instance for Generic, and
the default definitions will just work. The pattern looks as
follows:
import qualified GHC.Generics as GHC
import Generics.SOP
...
data T = ... deriving (GHC.Generic, ...)
instance Generic T -- empty
instance HasDatatypeInfo T -- empty, if you want/need metadata
Option 2: Derive via Template Haskell. For this, you need to
enable the TemplateHaskell extension. You can then use
deriveGeneric from module Generics.SOP.TH
to have the instance generated for you. The pattern looks as
follows:
import Generics.SOP
import Generics.SOP.TH
...
data T = ...
deriveGeneric ''T -- derives HasDatatypeInfo as well
Tradeoffs: Whether to use Option 1 or 2 is mainly a matter of personal taste. The version based on Template Haskell probably has less run-time overhead.
Non-standard instances: It is possible to give Generic instances manually that deviate from the standard scheme, as long as at least
to . from === id :: a -> a
still holds.
Associated types
type family Code a :: [[Type]]The code of a datatype.
This is a list of lists of its components. The outer list contains one element per constructor. The inner list contains one element per constructor argument (field).
Example: The datatype
data Tree = Leaf Int | Node Tree Treeis supposed to have the following code:
type instance Code (Tree a) = '[ '[ Int ] , '[ Tree, Tree ] ]
Instances193Generic, …
Generic E0Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric E1Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric E12Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric E2Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric E3Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric E6Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric E9Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FieldFormatDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FormatAdjustmentDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FormatParseDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FormatSignDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric VoidDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ByteOrderDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric BlockReasonDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ThreadStatusDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric NestedAtomicallyDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric NoMethodErrorDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric NonTerminationDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric PatternMatchFailDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric RecConErrorDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric RecSelErrorDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric RecUpdErrorDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric TypeErrorDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ConstrRepDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric DataRepDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FixityDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric AllDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric AnyDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric VersionDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ErrorCallDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ArithExceptionDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric LocationDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric SrcLocDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FingerprintDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FFFormatDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ErrnoDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CCharDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CClockDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CDoubleDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CFloatDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CIntDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CIntMaxDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CIntPtrDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CLLongDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CLongDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CPtrdiffDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CSCharDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CSUSecondsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CShortDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CSigAtomicDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CSizeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CTimeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CUCharDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CUIntDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CUIntMaxDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CUIntPtrDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CULLongDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CULongDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CUSecondsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CUShortDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CWcharDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric AssociativityDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric DDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric DecidedStrictnessDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FixityDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric RDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric SDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric SourceStrictnessDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric SourceUnpackednessDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric MaskingStateDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric BufferStateDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric IODeviceTypeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric SeekModeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CodingFailureModeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CodingProgressDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric AllocationLimitExceededDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ArrayExceptionDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric AssertionFailedDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric AsyncExceptionDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric BlockedIndefinitelyOnMVarDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric BlockedIndefinitelyOnSTMDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric DeadlockDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ExitCodeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric FixIOExceptionDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric IOErrorTypeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric IOExceptionDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric HandlePosnDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric LockModeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric BufferModeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric NewlineDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric NewlineModeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric IOModeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CCFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ConcFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric DebugFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric DoCostCentresDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric DoHeapProfileDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric DoTraceDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric GCFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric GiveGCStatsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric MiscFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ParFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ProfFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric RTSFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric TickyFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric TraceFlagsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric CallStackDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric SrcLocDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric StaticPtrInfoDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric GCDetailsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric RTSStatsDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric LexemeDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric NumberDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric GeneralCategoryDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric BoolDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric OrderingDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric RuntimeRepDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric VecCountDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric VecElemDefined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ()Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Complex a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (First a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Last a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Max a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Min a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (WrappedMonoid m)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (ArgDescr a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (ArgOrder a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (OptDescr a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (NonEmpty a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Identity a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (First a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Last a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Down a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Dual a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Endo a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Product a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Sum a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Par1 p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Buffer e)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Maybe a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (I a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric [a]Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Fixed a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Arg a b)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Either a b)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Proxy t)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (U1 p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (V1 p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Const a b)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Alt f a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (BufferCodec from to state)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (K a b)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Product f g a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Sum f g a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (K1 i c p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ((:*:) f g p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ((:+:) f g p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ((-.->) f g a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (Compose f g a)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (M1 i c f p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ((:.:) f g p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric ((:.:) f g p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, t26)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, t26, t27)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, t26, t27, t28)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphanGeneric (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, t26, t27, t28, t29)Defined in generics-sop-0.5.1.4 · Generics.SOP.Instances · orphan