[commit: ghc] master: Move Const to own module in Data.Functor.Const and enable PolyKinds (edcf17b)

git at git.haskell.org git at git.haskell.org
Mon Dec 21 12:41:42 UTC 2015


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/edcf17bd2ae503c2dda43ded40dca0950edfd018/ghc

>---------------------------------------------------------------

commit edcf17bd2ae503c2dda43ded40dca0950edfd018
Author: Shane O'Brien <shane at duairc.com>
Date:   Sun Dec 20 13:40:13 2015 +0100

    Move Const to own module in Data.Functor.Const and enable PolyKinds
    
    `Const` from `Control.Applicative` can trivially be made
    kind-polymorphic in its second argument. There has been a Trac issue
    about this for nearly a year now. It doesn't look like anybody objects
    to it, so I figured I might as well make a patch.
    
    Trac Issues: #10039, #10865, #11135
    
    Differential Revision: https://phabricator.haskell.org/D1630
    
    Reviewers: ekmett, hvr, bgamari
    
    Subscribers: RyanGlScott, thomie


>---------------------------------------------------------------

edcf17bd2ae503c2dda43ded40dca0950edfd018
 libraries/base/Control/Applicative.hs | 32 ++-----------------
 libraries/base/Data/Functor/Const.hs  | 60 +++++++++++++++++++++++++++++++++++
 libraries/base/base.cabal             |  1 +
 libraries/base/changelog.md           |  9 ++++++
 4 files changed, 73 insertions(+), 29 deletions(-)

diff --git a/libraries/base/Control/Applicative.hs b/libraries/base/Control/Applicative.hs
index 6770234..0892808 100644
--- a/libraries/base/Control/Applicative.hs
+++ b/libraries/base/Control/Applicative.hs
@@ -2,7 +2,6 @@
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE ScopedTypeVariables #-}
 
 -----------------------------------------------------------------------------
 -- |
@@ -56,38 +55,13 @@ import Data.Eq
 import Data.Ord
 import Data.Foldable (Foldable(..))
 import Data.Functor ((<$>))
+import Data.Functor.Const (Const(..))
 
 import GHC.Base
 import GHC.Generics
 import GHC.List (repeat, zipWith)
-import GHC.Read (Read(readsPrec), readParen, lex)
-import GHC.Show (Show(showsPrec), showParen, showString)
-
-newtype Const a b = Const { getConst :: a }
-                  deriving (Generic, Generic1, Monoid, Eq, Ord)
-
-instance Read a => Read (Const a b) where
-    readsPrec d = readParen (d > 10)
-        $ \r -> [(Const x,t) | ("Const", s) <- lex r, (x, t) <- readsPrec 11 s]
-
-instance Show a => Show (Const a b) where
-    showsPrec d (Const x) = showParen (d > 10) $
-                            showString "Const " . showsPrec 11 x
-
-instance Foldable (Const m) where
-    foldMap _ _ = mempty
-
-instance Functor (Const m) where
-    fmap _ (Const v) = Const v
-
-instance Monoid m => Applicative (Const m) where
-    pure _ = Const mempty
-    (<*>) = coerce (mappend :: m -> m -> m)
--- This is pretty much the same as
--- Const f <*> Const v = Const (f `mappend` v)
--- but guarantees that mappend for Const a b will have the same arity
--- as the one for a; it won't create a closure to raise the arity
--- to 2.
+import GHC.Read (Read)
+import GHC.Show (Show)
 
 newtype WrappedMonad m a = WrapMonad { unwrapMonad :: m a }
                          deriving (Generic, Generic1, Monad)
diff --git a/libraries/base/Data/Functor/Const.hs b/libraries/base/Data/Functor/Const.hs
new file mode 100644
index 0000000..21e6f85
--- /dev/null
+++ b/libraries/base/Data/Functor/Const.hs
@@ -0,0 +1,60 @@
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Data.Functor.Const
+-- Copyright   :  Conor McBride and Ross Paterson 2005
+-- License     :  BSD-style (see the LICENSE file in the distribution)
+--
+-- Maintainer  :  libraries at haskell.org
+-- Stability   :  experimental
+-- Portability :  portable
+
+-- The 'Const' functor.
+--
+-- @since 4.9.0.0
+
+module Data.Functor.Const (Const(..)) where
+
+import Data.Foldable (Foldable(foldMap))
+
+import GHC.Base
+import GHC.Generics (Generic, Generic1)
+import GHC.Read (Read(readsPrec), readParen, lex)
+import GHC.Show (Show(showsPrec), showParen, showString)
+
+-- | The 'Const' functor.
+newtype Const a b = Const { getConst :: a }
+                  deriving (Generic, Generic1, Monoid, Eq, Ord)
+
+-- | This instance would be equivalent to the derived instances of the
+-- 'Const' newtype if the 'runConst' field were removed
+instance Read a => Read (Const a b) where
+    readsPrec d = readParen (d > 10)
+        $ \r -> [(Const x,t) | ("Const", s) <- lex r, (x, t) <- readsPrec 11 s]
+
+-- | This instance would be equivalent to the derived instances of the
+-- 'Const' newtype if the 'runConst' field were removed
+instance Show a => Show (Const a b) where
+    showsPrec d (Const x) = showParen (d > 10) $
+                            showString "Const " . showsPrec 11 x
+
+instance Foldable (Const m) where
+    foldMap _ _ = mempty
+
+instance Functor (Const m) where
+    fmap _ (Const v) = Const v
+
+instance Monoid m => Applicative (Const m) where
+    pure _ = Const mempty
+    (<*>) = coerce (mappend :: m -> m -> m)
+-- This is pretty much the same as
+-- Const f <*> Const v = Const (f `mappend` v)
+-- but guarantees that mappend for Const a b will have the same arity
+-- as the one for a; it won't create a closure to raise the arity
+-- to 2.
diff --git a/libraries/base/base.cabal b/libraries/base/base.cabal
index cc85e9b..cd77e55 100644
--- a/libraries/base/base.cabal
+++ b/libraries/base/base.cabal
@@ -146,6 +146,7 @@ Library
         Data.Functor
         Data.Functor.Classes
         Data.Functor.Compose
+        Data.Functor.Const
         Data.Functor.Identity
         Data.Functor.Product
         Data.Functor.Sum
diff --git a/libraries/base/changelog.md b/libraries/base/changelog.md
index 82def76..33a5114 100644
--- a/libraries/base/changelog.md
+++ b/libraries/base/changelog.md
@@ -104,6 +104,15 @@
   * The `IsString` instance for `[Char]` has been modified to eliminate
     ambiguity arising from overloaded strings and functions like `(++)`.
 
+  * Move `Const` from `Control.Applicative` to its own module in
+   `Data.Functor.Const`. (#11135)
+
+  * Enable `PolyKinds` in the `Data.Functor.Const` module to give `Const`
+    the kind `* -> k -> *`. (#10039)
+
+  * Re-export `Const` from `Control.Applicative` for backwards compatibility.
+
+
 ## 4.8.2.0  *Oct 2015*
 
   * Bundled with GHC 7.10.3



More information about the ghc-commits mailing list