singletons-2.6: A framework for generating singleton types
Copyright(C) 2013 Richard Eisenberg
LicenseBSD-style (see LICENSE)
MaintainerRyan Scott
Safe HaskellNone



This file implements singletonStar, which generates a datatype Rep and associated singleton from a list of types. The promoted version of Rep is kind * and the Haskell types themselves. This is still very experimental, so expect unusual results!



singletonStar Source #


:: DsMonad q 
=> [Name]

A list of Template Haskell Names for types

-> q [Dec] 

Produce a representation and singleton for the collection of types given.

A datatype Rep is created, with one constructor per type in the declared universe. When this type is promoted by the singletons library, the constructors become full types in *, not just promoted data constructors.

For example,

$(singletonStar [''Nat, ''Bool, ''Maybe])

generates the following:

data Rep = Nat | Bool | Maybe Rep deriving (Eq, Ord, Read, Show)

and its singleton. However, because Rep is promoted to *, the singleton is perhaps slightly unexpected:

data SRep (a :: *) where
  SNat :: Sing Nat
  SBool :: Sing Bool
  SMaybe :: Sing a -> Sing (Maybe a)
type instance Sing = SRep

The unexpected part is that Nat, Bool, and Maybe above are the real Nat, Bool, and Maybe, not just promoted data constructors.

Please note that this function is very experimental. Use at your own risk.