diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CabalHelper/Compiletime/Types.hs | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/CabalHelper/Compiletime/Types.hs b/src/CabalHelper/Compiletime/Types.hs index 6b7d74a..9911aec 100644 --- a/src/CabalHelper/Compiletime/Types.hs +++ b/src/CabalHelper/Compiletime/Types.hs @@ -15,7 +15,7 @@ -- along with this program. If not, see <http://www.gnu.org/licenses/>. {-# LANGUAGE DeriveGeneric, DeriveDataTypeable, DefaultSignatures, - StandaloneDeriving, GADTs, DataKinds, KindSignatures, RankNTypes #-} + StandaloneDeriving, GADTs, DataKinds, KindSignatures, RankNTypes, PolyKinds #-} {-| Module : CabalHelper.Compiletime.Types @@ -105,6 +105,34 @@ data DistDir (pt :: ProjType) where deriving instance Show (DistDir pt) +-- | General purpose existential wrapper. Useful for hiding a phantom type +-- argument. +-- +-- Say you have: +-- +-- @ +-- {-# LANGUAGE DataKinds, GADTS #-} +-- data K = A | B | ... +-- data Q k where +-- QA :: ... -> Q 'A +-- QB :: ... -> Q 'B +-- @ +-- +-- and you want a list of @Q@. You can use @Ex@ to hide the phantom type +-- argument and recover it later by matching on the GADT constructors: +-- +-- @ +-- qa :: Q A +-- qa = QA +-- +-- qb :: Q B +-- qb = QB +-- +-- mylist :: [Ex Q] +-- mylist = [Ex qa, Ex qb] +-- @ +data Ex a = forall x. Ex (a x) + -- | Environment for running a 'Query'. The constructor is not exposed in the -- API to allow extending it with more fields without breaking user code. -- |