shithub: MicroHs

Download patch

ref: e3102605c0ddbfc934662455f4c849a49ecb2a33
parent: 52b1295c3c1922740b0ec68f633591e294c5c838
author: Lennart Augustsson <lennart@augustsson.net>
date: Sun Sep 22 21:05:38 EDT 2024

Redo Monoid&Semigroup again.

--- a/Makefile
+++ b/Makefile
@@ -198,7 +198,7 @@
 MCABALBIN=$(MCABAL)/bin
 MDIST=dist-mcabal
 BASE=base-$(VERSION)
-BASEMODULES=Control.Applicative Control.Arrow Control.Category Control.DeepSeq Control.Error Control.Exception Control.Monad Control.Monad.Fail Control.Monad.Fix Control.Monad.ST Control.Monad.Zip Data.Array Data.Bits Data.Bool Data.Bounded Data.ByteString Data.Char Data.Complex Data.Constraint Data.Data Data.Double Data.Dynamic Data.Either Data.Enum Data.Eq Data.Float Data.FloatW Data.Floating Data.Foldable Data.Fractional Data.Function Data.Functor Data.Functor.Classes Data.Functor.Compose Data.Functor.Const Data.Functor.Identity Data.Functor.Product Data.Functor.Sum Data.IOArray Data.IORef Data.Int Data.Integer Data.Integral Data.Ix Data.List Data.List.NonEmpty Data.Maybe Data.Monoid Data.Num Data.Ord Data.Proxy Data.Ratio Data.Real Data.RealFloat Data.RealFrac Data.Records Data.STRef Data.Semigroup Data.String Data.Text Data.Time.Clock Data.Time.Format Data.Traversable Data.Tuple Data.Type.Equality Data.TypeLits Data.Typeable Data.Version Data.Void Data.Word Data.ZipList Debug.Trace Foreign.C.String Foreign.C.Types Foreign.ForeignPtr Foreign.Marshal.Alloc Foreign.Marshal.Array Foreign.Marshal.Utils Foreign.Ptr Foreign.Storable GHC.Stack GHC.Types Numeric Numeric.FormatFloat Numeric.Natural Prelude System.Cmd System.Compress System.Directory System.Environment System.Exit System.IO System.IO.MD5 System.IO.PrintOrRun System.IO.Serialize System.IO.TimeMilli System.IO.Unsafe System.Info System.Process Text.Printf Text.ParserCombinators.ReadP Text.ParserCombinators.ReadPrec Text.Read Text.Read.Lex Text.Show TimeCompat Unsafe.Coerce
+BASEMODULES=Control.Applicative Control.Arrow Control.Category Control.DeepSeq Control.Error Control.Exception Control.Monad Control.Monad.Fail Control.Monad.Fix Control.Monad.ST Control.Monad.Zip Data.Array Data.Bits Data.Bool Data.Bounded Data.ByteString Data.Char Data.Complex Data.Constraint Data.Data Data.Double Data.Dynamic Data.Either Data.Enum Data.Eq Data.Float Data.FloatW Data.Floating Data.Foldable Data.Foldable1 Data.Fractional Data.Function Data.Functor Data.Functor.Classes Data.Functor.Compose Data.Functor.Const Data.Functor.Identity Data.Functor.Product Data.Functor.Sum Data.IOArray Data.IORef Data.Int Data.Integer Data.Integral Data.Ix Data.List Data.List.NonEmpty Data.Maybe Data.Monoid Data.Num Data.Ord Data.Proxy Data.Ratio Data.Real Data.RealFloat Data.RealFrac Data.Records Data.STRef Data.Semigroup Data.String Data.Text Data.Time.Clock Data.Time.Format Data.Traversable Data.Tuple Data.Type.Equality Data.TypeLits Data.Typeable Data.Version Data.Void Data.Word Data.ZipList Debug.Trace Foreign.C.String Foreign.C.Types Foreign.ForeignPtr Foreign.Marshal.Alloc Foreign.Marshal.Array Foreign.Marshal.Utils Foreign.Ptr Foreign.Storable GHC.Stack GHC.Types Numeric Numeric.FormatFloat Numeric.Natural Prelude System.Cmd System.Compress System.Directory System.Environment System.Exit System.IO System.IO.MD5 System.IO.PrintOrRun System.IO.Serialize System.IO.TimeMilli System.IO.Unsafe System.Info System.Process Text.Printf Text.ParserCombinators.ReadP Text.ParserCombinators.ReadPrec Text.Read Text.Read.Lex Text.Show TimeCompat Unsafe.Coerce
 
 $(MCABALBIN)/mhs: bin/mhs
 	@mkdir -p $(MCABALBIN)
--- a/lib/AllOfLib.hs
+++ b/lib/AllOfLib.hs
@@ -28,6 +28,7 @@
 import Data.FloatW
 import Data.Floating
 import Data.Foldable
+import Data.Foldable1
 import Data.Fractional
 import Data.Function
 import Data.Functor
@@ -51,6 +52,7 @@
 import Data.Maybe
 import Data.Maybe_Type
 import Data.Monoid
+import Data.Monoid.Internal
 import Data.Num
 import Data.Ord
 import Data.Orphans
--- a/lib/Control/Monad.hs
+++ b/lib/Control/Monad.hs
@@ -43,7 +43,7 @@
 import Data.Function
 import Data.Functor
 import Data.List
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Ord
 --import Data.Maybe
 
--- a/lib/Control/Monad/Fix.hs
+++ b/lib/Control/Monad/Fix.hs
@@ -5,7 +5,7 @@
 import Control.Monad
 import Data.Function(fix)
 import Data.List.NonEmpty(NonEmpty(..))
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Tuple
 
 class (Monad m) => MonadFix m where
--- a/lib/Control/Monad/Zip.hs
+++ b/lib/Control/Monad/Zip.hs
@@ -17,20 +17,9 @@
 -----------------------------------------------------------------------------
 
 module Control.Monad.Zip where
-{-
-import GHC.Internal.Control.Monad (liftM, liftM2)
-import GHC.Internal.Data.Functor.Identity
-import qualified GHC.Internal.Data.Functor
-import GHC.Internal.Data.Monoid
-import GHC.Internal.Data.Ord ( Down(..) )
-import GHC.Internal.Data.Proxy
-import GHC.Generics
-import GHC.Tuple (Solo (..))
-import Prelude
--}
 import Control.Monad
 import Data.Functor.Identity
-import Data.Monoid
+import Data.Monoid.Internal
 import qualified Data.List.NonEmpty as NE
 --import Data.Tuple
 
--- a/lib/Data/ByteString.hs
+++ b/lib/Data/ByteString.hs
@@ -159,7 +159,7 @@
 import qualified Data.List as P
 import Data.List.NonEmpty(NonEmpty, fromList)
 import Data.Bits
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Semigroup
 import Data.String
 import Data.Word(Word8)
--- a/lib/Data/Foldable.hs
+++ b/lib/Data/Foldable.hs
@@ -56,10 +56,10 @@
 import qualified Data.List as List
 import Data.Maybe
 import Data.Monoid
+import Data.Monoid.Internal
 import Data.Num
 import Data.Ord
 import Data.Proxy
-import Data.Semigroup
 
 newtype MMax a = MMax (Maybe a)
 getMMax :: forall a . MMax a -> Maybe a
--- a/lib/Data/Functor/Compose.hs
+++ b/lib/Data/Functor/Compose.hs
@@ -31,7 +31,7 @@
 import Data.Data (Data)
 import Data.Foldable (Foldable(..))
 import Data.Functor.Classes
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Traversable
 --import Data.Type.Equality (TestEquality(..), (:~:)(..))
 --import GHC.Generics (Generic, Generic1)
--- a/lib/Data/Functor/Const.hs
+++ b/lib/Data/Functor/Const.hs
@@ -11,7 +11,7 @@
 import Data.Functor
 import Data.Functor.Const_Type
 import Data.Int
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Ord
 import Text.Show
 
--- a/lib/Data/List.hs
+++ b/lib/Data/List.hs
@@ -39,10 +39,9 @@
 import Data.Integral
 import Data.List_Type
 import Data.Maybe_Type
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Num
 import Data.Ord
-import Data.Semigroup
 import Data.Tuple
 --import Text.Read
 import Text.Show
--- a/lib/Data/List/NonEmpty.hs
+++ b/lib/Data/List/NonEmpty.hs
@@ -116,7 +116,7 @@
 import Data.List.NonEmpty_Type
 import Data.Num
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Ord
 import Data.Traversable
 import Data.Tuple
--- a/lib/Data/Maybe.hs
+++ b/lib/Data/Maybe.hs
@@ -15,9 +15,8 @@
 import Data.Int
 import Data.List
 import Data.Maybe_Type
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Ord
-import Data.Semigroup
 import Text.Show
 
 instance forall a . Eq a => Eq (Maybe a) where
--- a/lib/Data/Monoid.hs
+++ b/lib/Data/Monoid.hs
@@ -1,135 +1,25 @@
-module Data.Monoid(module Data.Monoid) where
-import Prelude()              -- do not import Prelude
-import Primitives
-import Control.Applicative
-import Control.Error
-import Data.Bool
-import Data.Bounded
-import Data.Eq
-import Data.Function
-import Data.Functor
-import Data.Int
-import Data.Integral
-import Data.List_Type
-import Data.List.NonEmpty_Type
-import Data.Ord
+module Data.Monoid(
+  Monoid(..),
+  Endo(..), appEndo,
+  Dual(..), getDual,
+  Max(..), getMax,
+  Min(..), getMin,
+  Sum(..), getSum,
+  Product(..), getProduct,
+  All(..), getAll,
+  Any(..), getAny,
+  Arg(..), ArgMin, ArgMax,
+  Alt(..), getAlt,
+  First(..), getFirst,
+  Last(..), getLast,
+  ) where
+import Prelude()
 import Data.Maybe_Type
-import Data.Num
-import Text.Show
+import Data.Monoid.Internal
 
-class Semigroup a => Monoid a where
-  mempty :: a
-  mappend :: a -> a -> a
-  mappend = (<>)
-  mconcat :: [a] -> a
-  mconcat [] = mempty
-  mconcat (a:as) = a <> mconcat as
+-- First and Last are different in Monoid and Semigroup,
+-- so put them here.
 
----------------------
-
-newtype Endo a = Endo (a -> a)
-appEndo :: forall a . Endo a -> (a -> a)
-appEndo (Endo f) = f
-
-instance forall a . Semigroup (Endo a) where
-  Endo f <> Endo g = Endo (f . g)
-
-instance forall a . Monoid (Endo a) where
-  mempty = Endo id
-
----------------------
-
-newtype Dual a = Dual a
-getDual :: forall a . Dual a -> a
-getDual (Dual a) = a
-
-instance forall a . Semigroup a => Semigroup (Dual a) where
-  Dual a <> Dual b = Dual (b <> a)
-
-instance forall a . Monoid a => Monoid (Dual a) where
-  mempty = Dual mempty
-
-instance Functor Dual where
-  fmap f (Dual a) = Dual (f a)
-
-instance Applicative Dual where
-  pure = Dual
-  Dual f <*> Dual b = Dual (f b)
-
----------------------
-
-newtype Max a = Max a
-getMax :: forall a . Max a -> a
-getMax (Max a) = a
-
-instance forall a . Ord a => Semigroup (Max a) where
-  Max a <> Max b = Max (a `max` b)
-
-instance forall a . (Ord a, Bounded a) => Monoid (Max a) where
-  mempty = Max minBound
-
----------------------
-
-newtype Min a = Min a
-getMin :: forall a . Min a -> a
-getMin (Min a) = a
-
-instance forall a . Ord a => Semigroup (Min a) where
-  Min a <> Min b = Min (a `min` b)
-
-instance forall a . (Ord a, Bounded a) => Monoid (Min a) where
-  mempty = Min maxBound
-
----------------------
-
-newtype Sum a = Sum a
-getSum :: forall a . Sum a -> a
-getSum (Sum a) = a
-
-instance forall a . Num a => Semigroup (Sum a) where
-  Sum a <> Sum b = Sum (a + b)
-
-instance forall a . (Num a) => Monoid (Sum a) where
-  mempty = Sum 0
-
----------------------
-
-newtype Product a = Product a
-getProduct :: forall a . Product a -> a
-getProduct (Product a) = a
-
-instance forall a . Num a => Semigroup (Product a) where
-  Product a <> Product b = Product (a * b)
-
-instance forall a . (Num a) => Monoid (Product a) where
-  mempty = Product 1
-
----------------------
-
-newtype All = All Bool
-getAll :: All -> Bool
-getAll (All a) = a
-
-instance Semigroup All where
-  All a <> All b = All (a && b)
-
-instance Monoid All where
-  mempty = All True
-
----------------------
-
-newtype Any = Any Bool
-getAny :: Any -> Bool
-getAny (Any a) = a
-
-instance Semigroup Any where
-  Any a <> Any b = Any (a || b)
-
-instance Monoid Any where
-  mempty = Any False
-
----------------------
-
 newtype First a = First (Maybe a)
 getFirst :: forall a . First a -> Maybe a
 getFirst (First a) = a
@@ -141,7 +31,6 @@
 instance forall a . Monoid (First a) where
   mempty = First Nothing
 
----------------------
 
 newtype Last a = Last (Maybe a)
 getLast :: forall a . Last a -> Maybe a
@@ -153,122 +42,3 @@
 
 instance forall a . Monoid (Last a) where
   mempty = Last Nothing
-
----------------------
-
-instance Semigroup Ordering where
-  LT <> _ = LT
-  EQ <> o = o
-  GT <> _ = GT
-
-instance Monoid Ordering where
-  mempty = EQ
-
-----------------------
-
-data Arg a b = Arg a b
-  deriving(Show)
-
-type ArgMin a b = Min (Arg a b)
-
-type ArgMax a b = Max (Arg a b)
-
-instance Functor (Arg a) where
-  fmap f (Arg x a) = Arg x (f a)
-
-instance Eq a => Eq (Arg a b) where
-  Arg a _ == Arg b _ = a == b
-
-instance Ord a => Ord (Arg a b) where
-  Arg a _ `compare` Arg b _ = compare a b
-  min x@(Arg a _) y@(Arg b _)
-    | a <= b    = x
-    | otherwise = y
-  max x@(Arg a _) y@(Arg b _)
-    | a >= b    = x
-    | otherwise = y
-
-----------------------
-
-newtype Alt f a = Alt (f a)
---  deriving (Show)
-getAlt :: Alt f a -> f a
-getAlt (Alt x) = x
-{-
-  deriving ( Generic     -- ^ @since base-4.8.0.0
-           , Generic1    -- ^ @since base-4.8.0.0
-           , Read        -- ^ @since base-4.8.0.0
-           , Show        -- ^ @since base-4.8.0.0
-           , Eq          -- ^ @since base-4.8.0.0
-           , Ord         -- ^ @since base-4.8.0.0
-           , Num         -- ^ @since base-4.8.0.0
-           , Enum        -- ^ @since base-4.8.0.0
-           , Monad       -- ^ @since base-4.8.0.0
-           , MonadPlus   -- ^ @since base-4.8.0.0
-           , Applicative -- ^ @since base-4.8.0.0
-           , Alternative -- ^ @since base-4.8.0.0
-           , Functor     -- ^ @since base-4.8.0.0
-           )
--}
-
-instance Alternative f => Semigroup (Alt f a) where
-    Alt x <> Alt y = Alt (x <|> y)
-    stimes = stimesMonoid
-
-instance Alternative f => Monoid (Alt f a) where
-    mempty = Alt empty
-
-----------------------
-
--- This really belongs in Data.Semigroup,
--- but some functions have Monoid as in the context.
-
-infixr 6 <>
-class Semigroup a where
-  (<>)    :: a -> a -> a
-  sconcat :: NonEmpty a -> a
-  stimes  :: (Integral b, Ord b) => b -> a -> a
-
-  sconcat (a :| as) = go a as
-    where go b (c:cs) = b <> go c cs
-          go b []     = b
-
-  stimes y0 x0
-    | y0 <= 0   = error "stimes: positive multiplier expected"
-    | otherwise = f x0 y0
-    where
-      f x y
-        | y `rem` 2 == 0 = f (x <> x) (y `quot` 2)
-        | y == 1 = x
-        | otherwise = g (x <> x) (y `quot` 2) x
-      g x y z
-        | y `rem` 2 == 0 = g (x <> x) (y `quot` 2) z
-        | y == 1 = x <> z
-        | otherwise = g (x <> x) (y `quot` 2) (x <> z)
-
-stimesIdempotent :: (Integral b, Ord b) => b -> a -> a
-stimesIdempotent n x =
-  if n <= 0 then error "stimesIdempotent: positive multiplier expected"
-  else x
-
-stimesIdempotentMonoid :: (Ord b, Integral b, Monoid a) => b -> a -> a
-stimesIdempotentMonoid n x = case compare n 0 of
-  LT -> error "stimesIdempotentMonoid: negative multiplier"
-  EQ -> mempty
-  GT -> x
-
-stimesMonoid :: (Ord b, Integral b, Monoid a) => b -> a -> a
-stimesMonoid n x0 = case compare n 0 of
-  LT -> error "stimesMonoid: negative multiplier"
-  EQ -> mempty
-  GT -> f x0 n
-    where
-      f x y
-        | even y = f (x `mappend` x) (y `quot` 2)
-        | y == 1 = x
-        | otherwise = g (x `mappend` x) (y `quot` 2) x
-      g x y z
-        | even y = g (x `mappend` x) (y `quot` 2) z
-        | y == 1 = x `mappend` z
-        | otherwise = g (x `mappend` x) (y `quot` 2) (x `mappend` z)
-
--- a/lib/Data/Semigroup.hs
+++ b/lib/Data/Semigroup.hs
@@ -1,6 +1,154 @@
 module Data.Semigroup(
-  module Data.Monoid,
+  Semigroup(..),
+  Endo(..), appEndo,
+  Dual(..), getDual,
+  Max(..), getMax,
+  Min(..), getMin,
+  Sum(..), getSum,
+  Product(..), getProduct,
+  All(..), getAll,
+  Any(..), getAny,
+  Arg(..), ArgMin, ArgMax,
+  Alt(..), getAlt,
+  First(..), getFirst,
+  Last(..), getLast,
+  stimesIdempotent, stimesIdempotentMonoid, stimesMonoid,
   ) where
 import Prelude()              -- do not import Prelude
-import Data.Monoid hiding(Monoid(..))
--- Data.Monoid contains the definition of Semigroup
+import Data.Bool
+import Data.Bounded
+import Data.Eq
+import Data.Function
+import Data.List.NonEmpty_Type
+import Data.Ord
+import Data.Monoid.Internal
+import Text.Show
+
+{-
+newtype First a = First { getFirst :: a }
+  deriving ( Bounded  -- ^ @since 4.9.0.0
+           , Eq       -- ^ @since 4.9.0.0
+           , Ord      -- ^ @since 4.9.0.0
+           , Show     -- ^ @since 4.9.0.0
+           , Read     -- ^ @since 4.9.0.0
+           , Data     -- ^ @since 4.9.0.0
+           , Generic  -- ^ @since 4.9.0.0
+           , Generic1 -- ^ @since 4.9.0.0
+           )
+
+instance Enum a => Enum (First a) where
+  succ (First a) = First (succ a)
+  pred (First a) = First (pred a)
+  toEnum = First . toEnum
+  fromEnum = fromEnum . getFirst
+  enumFrom (First a) = First `fmap` enumFrom a
+  enumFromThen (First a) (First b) = First `fmap` enumFromThen a b
+  enumFromTo (First a) (First b) = First `fmap` enumFromTo a b
+  enumFromThenTo (First a) (First b) (First c) = First `fmap` enumFromThenTo a b c
+-}
+
+newtype First a = First a
+  deriving(Eq, Ord, Show, Bounded)
+getFirst :: First a -> a
+getFirst (First a) = a
+
+instance Semigroup (First a) where
+  a <> _ = a
+  stimes = stimesIdempotent
+  sconcat (x :| _) = x
+
+{-
+-- | @since 4.9.0.0
+instance Functor First where
+  fmap f (First x) = First (f x)
+
+-- | @since 4.9.0.0
+instance Foldable First where
+  foldMap f (First a) = f a
+
+-- | @since 4.9.0.0
+instance Traversable First where
+  traverse f (First a) = First `fmap` f a
+
+-- | @since 4.9.0.0
+instance Applicative First where
+  pure x = First x
+  a <* _ = a
+  _ *> a = a
+  (<*>) = coerce
+  liftA2 = coerce
+
+-- | @since 4.9.0.0
+instance Monad First where
+  (>>) = (*>)
+  First a >>= f = f a
+
+-- | @since 4.9.0.0
+instance MonadFix First where
+  mfix f = fix (f . getFirst)
+-}
+
+{-
+newtype Last a = Last { getLast :: a }
+  deriving ( Bounded  -- ^ @since 4.9.0.0
+           , Eq       -- ^ @since 4.9.0.0
+           , Ord      -- ^ @since 4.9.0.0
+           , Show     -- ^ @since 4.9.0.0
+           , Read     -- ^ @since 4.9.0.0
+           , Data     -- ^ @since 4.9.0.0
+           , Generic  -- ^ @since 4.9.0.0
+           , Generic1 -- ^ @since 4.9.0.0
+           )
+
+-- | @since 4.9.0.0
+instance Enum a => Enum (Last a) where
+  succ (Last a) = Last (succ a)
+  pred (Last a) = Last (pred a)
+  toEnum = Last . toEnum
+  fromEnum = fromEnum . getLast
+  enumFrom (Last a) = Last `fmap` enumFrom a
+  enumFromThen (Last a) (Last b) = Last `fmap` enumFromThen a b
+  enumFromTo (Last a) (Last b) = Last `fmap` enumFromTo a b
+  enumFromThenTo (Last a) (Last b) (Last c) = Last `fmap` enumFromThenTo a b c
+-}
+
+newtype Last a = Last a
+  deriving(Eq, Ord, Show, Bounded)
+getLast :: Last a -> a
+getLast (Last a) = a
+
+instance Semigroup (Last a) where
+  _ <> b = b
+  stimes = stimesIdempotent
+
+{-
+-- | @since 4.9.0.0
+instance Functor Last where
+  fmap f (Last x) = Last (f x)
+  a <$ _ = Last a
+
+-- | @since 4.9.0.0
+instance Foldable Last where
+  foldMap f (Last a) = f a
+
+-- | @since 4.9.0.0
+instance Traversable Last where
+  traverse f (Last a) = Last `fmap` f a
+
+-- | @since 4.9.0.0
+instance Applicative Last where
+  pure = Last
+  a <* _ = a
+  _ *> a = a
+  (<*>) = coerce
+  liftA2 = coerce
+
+-- | @since 4.9.0.0
+instance Monad Last where
+  (>>) = (*>)
+  Last a >>= f = f a
+
+-- | @since 4.9.0.0
+instance MonadFix Last where
+  mfix f = fix (f . getLast)
+-}
--- a/lib/Data/Text.hs
+++ b/lib/Data/Text.hs
@@ -6,8 +6,7 @@
   head,
   ) where
 import Prelude(); import MiniPrelude hiding(head)
-import Data.Monoid
-import Data.Semigroup
+import Data.Monoid.Internal
 import Data.String
 import qualified Data.ByteString.Internal as BS
 
--- a/lib/Data/Traversable.hs
+++ b/lib/Data/Traversable.hs
@@ -43,7 +43,7 @@
 import Data.List_Type
 import qualified Data.List as List
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Proxy
 --import Data.Ord ( Down(..) )
 --import Data.Proxy ( Proxy(..) )
--- a/lib/Data/Tuple.hs
+++ b/lib/Data/Tuple.hs
@@ -11,9 +11,8 @@
 import Data.Eq
 import Data.Function
 import Data.Int
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Ord
-import Data.Semigroup
 import Text.Show
 
 --data (a,b) = (a,b)  -- all tuples are built in
--- a/lib/MiniPrelude.hs
+++ b/lib/MiniPrelude.hs
@@ -14,7 +14,7 @@
   module Data.Integral,
   module Data.List,
   module Data.Maybe,
-  module Data.Monoid,
+  module Data.Monoid.Internal,
   module Data.Num,
   module Data.Records,
   module Data.String,
@@ -45,7 +45,7 @@
                  elem, notElem, lookup, zip, zip3, zipWith, zipWith3, unzip, unzip3,
                  lines, words, unlines, unwords)
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid.Internal
 import Data.Num
 import Data.Records
 import Data.String
--- a/lib/Text/ParserCombinators/ReadP.hs
+++ b/lib/Text/ParserCombinators/ReadP.hs
@@ -86,11 +86,8 @@
 import Data.Num
 import Data.List
 import Data.List.NonEmpty
-import Data.Monoid
-{-
-import Data.List ( replicate, null )
-import Control.Monad.Fail
--}
+import Data.Monoid.Internal
+
 infixr 5 +++, <++
 
 ------------------------------------------------------------------------
--