diff options
author | Ryan Scott <ryan.gl.scott@gmail.com> | 2017-07-24 11:54:37 -0400 |
---|---|---|
committer | Ryan Scott <ryan.gl.scott@gmail.com> | 2017-07-24 11:54:38 -0400 |
commit | 88f20bdb60fb9469fa8ae953f7c2509d1913fdf7 (patch) | |
tree | 9e7a34b27dc282158bf6673d4709ba3a43438bda /libraries | |
parent | 145f1c7f2367ff8404905fc8eca8de902711d05e (diff) | |
download | haskell-88f20bdb60fb9469fa8ae953f7c2509d1913fdf7.tar.gz |
Add a caveat to the GHC.Generics examples about :+: nesting
Summary:
GHC's choice in how it nests `:+:` can sometimes affect the
implementaiton of `GHC.Generics`-related code, so we should make a note of
this in the examples we provide. Fixes #9453.
Test Plan: Read it, like it, build it, ship it
Reviewers: bgamari, austin, hvr
Reviewed By: bgamari
Subscribers: rwbarton, thomie
GHC Trac Issues: #9453
Differential Revision: https://phabricator.haskell.org/D3782
Diffstat (limited to 'libraries')
-rw-r--r-- | libraries/base/GHC/Generics.hs | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/libraries/base/GHC/Generics.hs b/libraries/base/GHC/Generics.hs index cc85a1dfba..14184c2eb6 100644 --- a/libraries/base/GHC/Generics.hs +++ b/libraries/base/GHC/Generics.hs @@ -1,23 +1,23 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE DeriveFunctor #-} +{-# LANGUAGE CPP #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DeriveFunctor #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE PolyKinds #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE Trustworthy #-} -{-# LANGUAGE TypeFamilies #-} -{-# LANGUAGE TypeInType #-} -{-# LANGUAGE TypeOperators #-} -{-# LANGUAGE TypeSynonymInstances #-} -{-# LANGUAGE UndecidableInstances #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE MagicHash #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE PolyKinds #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE Trustworthy #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TypeInType #-} +{-# LANGUAGE TypeOperators #-} +{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE UndecidableInstances #-} ----------------------------------------------------------------------------- -- | @@ -256,9 +256,9 @@ module GHC.Generics ( -- all the constructors and fields as needed. However, users /should not rely on -- a specific nesting strategy/ for ':+:' and ':*:' being used. The compiler is -- free to choose any nesting it prefers. (In practice, the current implementation --- tries to produce a more or less balanced nesting, so that the traversal of the --- structure of the datatype from the root to a particular component can be performed --- in logarithmic rather than linear time.) +-- tries to produce a more-or-less balanced nesting, so that the traversal of +-- the structure of the datatype from the root to a particular component can be +-- performed in logarithmic rather than linear time.) -- ** Defining datatype-generic functions -- @@ -351,6 +351,14 @@ module GHC.Generics ( -- encode' ('R1' x) = True : encode' x -- @ -- +-- (Note that this encoding strategy may not be reliable across different +-- versions of GHC. Recall that the compiler is free to choose any nesting +-- of ':+:' it chooses, so if GHC chooses @(a ':+:' b) ':+:' c@, then the +-- encoding for @a@ would be @[False, False]@, @b@ would be @[False, True]@, +-- and @c@ would be @[True]@. However, if GHC chooses @a ':+:' (b ':+:' c)@, +-- then the encoding for @a@ would be @[False]@, @b@ would be @[True, False]@, +-- and @c@ would be @[True, True]@.) +-- -- In the case for ':*:', we append the encodings of the two subcomponents: -- -- @ |