Teo Camarasu pushed to branch wip/T26875 at Glasgow Haskell Compiler / GHC
Commits:
-
cab1bead
by Teo Camarasu at 2026-02-18T20:28:03+00:00
13 changed files:
- libraries/base/src/System/IO.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fix.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST/Lazy/Imp.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor/Identity.hs
- libraries/ghc-internal/src/GHC/Internal/System/IO.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Monad.hs
- testsuite/tests/ghci/scripts/ListTuplePunsPpr.stdout
- testsuite/tests/ghci/scripts/T4175.stdout
- testsuite/tests/interface-stability/base-exports.stdout
- testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs
- testsuite/tests/interface-stability/base-exports.stdout-mingw32
- testsuite/tests/interface-stability/base-exports.stdout-ws-32
- testsuite/tests/mdo/should_fail/mdofail006.stderr
Changes:
| ... | ... | @@ -185,6 +185,7 @@ module System.IO |
| 185 | 185 | ) where
|
| 186 | 186 | |
| 187 | 187 | import GHC.Internal.System.IO
|
| 188 | +import GHC.Internal.Control.Monad.Fix (fixIO)
|
|
| 188 | 189 | |
| 189 | 190 | -- $locking
|
| 190 | 191 | -- Implementations should enforce as far as possible, at least locally to the
|
| ... | ... | @@ -24,7 +24,8 @@ |
| 24 | 24 | |
| 25 | 25 | module GHC.Internal.Control.Monad.Fix (
|
| 26 | 26 | MonadFix(mfix),
|
| 27 | - fix
|
|
| 27 | + fix,
|
|
| 28 | + fixIO,
|
|
| 28 | 29 | ) where
|
| 29 | 30 | |
| 30 | 31 | import GHC.Internal.Data.Either
|
| ... | ... | @@ -35,11 +36,17 @@ import GHC.Internal.Data.Monoid ( Monoid, Dual(..), Sum(..), Product(..) |
| 35 | 36 | import GHC.Internal.Data.NonEmpty ( NonEmpty(..) )
|
| 36 | 37 | import GHC.Internal.Data.Ord ( Down(..) )
|
| 37 | 38 | import GHC.Internal.Data.Tuple ( Solo(..), snd )
|
| 38 | -import GHC.Internal.Base ( Monad, errorWithoutStackTrace, (.) )
|
|
| 39 | +import GHC.Internal.Base ( IO, Monad, errorWithoutStackTrace, (.), return, liftM )
|
|
| 39 | 40 | import GHC.Internal.Generics
|
| 40 | 41 | import GHC.Internal.List ( head, drop )
|
| 41 | 42 | import GHC.Internal.Control.Monad.ST.Imp
|
| 42 | -import GHC.Internal.System.IO
|
|
| 43 | +import qualified GHC.Internal.Control.Monad.ST.Lazy.Imp as Lazy
|
|
| 44 | +import GHC.Internal.Data.Functor.Identity (Identity(..))
|
|
| 45 | +import GHC.Internal.MVar
|
|
| 46 | +import GHC.Internal.IO.Unsafe
|
|
| 47 | +import GHC.Internal.IO.Exception
|
|
| 48 | +import GHC.Internal.TH.Monad
|
|
| 49 | +import GHC.Internal.Control.Exception
|
|
| 43 | 50 | |
| 44 | 51 | -- | Monads having fixed points with a \'knot-tying\' semantics.
|
| 45 | 52 | -- Instances of 'MonadFix' should satisfy the following laws:
|
| ... | ... | @@ -102,6 +109,86 @@ instance MonadFix NonEmpty where |
| 102 | 109 | instance MonadFix IO where
|
| 103 | 110 | mfix = fixIO
|
| 104 | 111 | |
| 112 | +-- ---------------------------------------------------------------------------
|
|
| 113 | +-- fixIO
|
|
| 114 | + |
|
| 115 | +-- | The implementation of 'Control.Monad.Fix.mfix' for 'IO'.
|
|
| 116 | +--
|
|
| 117 | +-- This operation may fail with:
|
|
| 118 | +--
|
|
| 119 | +-- * 'FixIOException' if the function passed to 'fixIO' inspects its argument.
|
|
| 120 | +--
|
|
| 121 | +-- ==== __Examples__
|
|
| 122 | +--
|
|
| 123 | +-- the IO-action is only executed once. The recursion is only on the values.
|
|
| 124 | +--
|
|
| 125 | +-- >>> take 3 <$> fixIO (\x -> putStr ":D" >> (:x) <$> readLn @Int)
|
|
| 126 | +-- :D
|
|
| 127 | +-- 2
|
|
| 128 | +-- [2,2,2]
|
|
| 129 | +--
|
|
| 130 | +-- If we are strict in the value, just as with 'Data.Function.fix', we do not get termination:
|
|
| 131 | +--
|
|
| 132 | +-- >>> fixIO (\x -> putStr x >> pure ('x' : x))
|
|
| 133 | +-- * hangs forever *
|
|
| 134 | +--
|
|
| 135 | +-- We can tie the knot of a structure within 'IO' using 'fixIO':
|
|
| 136 | +--
|
|
| 137 | +-- @
|
|
| 138 | +-- data Node = MkNode Int (IORef Node)
|
|
| 139 | +--
|
|
| 140 | +-- foo :: IO ()
|
|
| 141 | +-- foo = do
|
|
| 142 | +-- p \<- fixIO (\p -> newIORef (MkNode 0 p))
|
|
| 143 | +-- q <- output p
|
|
| 144 | +-- r <- output q
|
|
| 145 | +-- _ <- output r
|
|
| 146 | +-- pure ()
|
|
| 147 | +--
|
|
| 148 | +-- output :: IORef Node -> IO (IORef Node)
|
|
| 149 | +-- output ref = do
|
|
| 150 | +-- MkNode x p <- readIORef ref
|
|
| 151 | +-- print x
|
|
| 152 | +-- pure p
|
|
| 153 | +-- @
|
|
| 154 | +--
|
|
| 155 | +-- >>> foo
|
|
| 156 | +-- 0
|
|
| 157 | +-- 0
|
|
| 158 | +-- 0
|
|
| 159 | +fixIO :: (a -> IO a) -> IO a
|
|
| 160 | +fixIO k = do
|
|
| 161 | + m <- newEmptyMVar
|
|
| 162 | + ans <- unsafeDupableInterleaveIO
|
|
| 163 | + (readMVar m `catch` \BlockedIndefinitelyOnMVar ->
|
|
| 164 | + throwIO FixIOException)
|
|
| 165 | + result <- k ans
|
|
| 166 | + putMVar m result
|
|
| 167 | + return result
|
|
| 168 | + |
|
| 169 | +-- Note [Blackholing in fixIO]
|
|
| 170 | +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 171 | +-- We do our own explicit black holing here, because GHC's lazy
|
|
| 172 | +-- blackholing isn't enough. In an infinite loop, GHC may run the IO
|
|
| 173 | +-- computation a few times before it notices the loop, which is wrong.
|
|
| 174 | +--
|
|
| 175 | +-- NOTE2: the explicit black-holing with an IORef ran into trouble
|
|
| 176 | +-- with multiple threads (see #5421), so now we use an MVar. We used
|
|
| 177 | +-- to use takeMVar with unsafeInterleaveIO. This, however, uses noDuplicate#,
|
|
| 178 | +-- which is not particularly cheap. Better to use readMVar, which can be
|
|
| 179 | +-- performed in multiple threads safely, and to use unsafeDupableInterleaveIO
|
|
| 180 | +-- to avoid the noDuplicate cost.
|
|
| 181 | +--
|
|
| 182 | +-- What we'd ideally want is probably an IVar, but we don't quite have those.
|
|
| 183 | +-- STM TVars look like an option at first, but I don't think they are:
|
|
| 184 | +-- we'd need to be able to write to the variable in an IO context, which can
|
|
| 185 | +-- only be done using 'atomically', and 'atomically' is not allowed within
|
|
| 186 | +-- unsafePerformIO. We can't know if someone will try to use the result
|
|
| 187 | +-- of fixIO with unsafePerformIO!
|
|
| 188 | +--
|
|
| 189 | +-- See also System.IO.Unsafe.unsafeFixIO.
|
|
| 190 | +--
|
|
| 191 | + |
|
| 105 | 192 | -- | @since base-2.01
|
| 106 | 193 | instance MonadFix ((->) r) where
|
| 107 | 194 | mfix f = \ r -> let a = f a r in a
|
| ... | ... | @@ -116,6 +203,10 @@ instance MonadFix (Either e) where |
| 116 | 203 | instance MonadFix (ST s) where
|
| 117 | 204 | mfix = fixST
|
| 118 | 205 | |
| 206 | +-- | @since base-2.01
|
|
| 207 | +instance MonadFix (Lazy.ST s) where
|
|
| 208 | + mfix = Lazy.fixST
|
|
| 209 | + |
|
| 119 | 210 | -- Instances of Data.Monoid wrappers
|
| 120 | 211 | |
| 121 | 212 | -- | @since base-4.8.0.0
|
| ... | ... | @@ -171,3 +262,24 @@ instance (MonadFix f, MonadFix g) => MonadFix (f :*: g) where |
| 171 | 262 | -- | @since base-4.12.0.0
|
| 172 | 263 | instance MonadFix Down where
|
| 173 | 264 | mfix f = Down (fix (getDown . f))
|
| 265 | + |
|
| 266 | + |
|
| 267 | +-- | @since base-4.8.0.0
|
|
| 268 | +instance MonadFix Identity where
|
|
| 269 | + mfix f = Identity (fix (runIdentity . f))
|
|
| 270 | + |
|
| 271 | +-- | If the function passed to 'mfix' inspects its argument,
|
|
| 272 | +-- the resulting action will throw a 'FixIOException'.
|
|
| 273 | +--
|
|
| 274 | +-- @since 2.17.0.0
|
|
| 275 | +instance MonadFix Q where
|
|
| 276 | + -- We use the same blackholing approach as in fixIO.
|
|
| 277 | + -- See Note [Blackholing in fixIO].
|
|
| 278 | + mfix k = do
|
|
| 279 | + m <- runIO newEmptyMVar
|
|
| 280 | + ans <- runIO (unsafeDupableInterleaveIO
|
|
| 281 | + (readMVar m `catch` \BlockedIndefinitelyOnMVar ->
|
|
| 282 | + throwIO FixIOException))
|
|
| 283 | + result <- k ans
|
|
| 284 | + runIO (putMVar m result)
|
|
| 285 | + return result |
| ... | ... | @@ -37,7 +37,6 @@ module GHC.Internal.Control.Monad.ST.Lazy.Imp ( |
| 37 | 37 | unsafeIOToST
|
| 38 | 38 | ) where
|
| 39 | 39 | |
| 40 | -import GHC.Internal.Control.Monad.Fix
|
|
| 41 | 40 | import GHC.Internal.Data.Tuple
|
| 42 | 41 | |
| 43 | 42 | import qualified GHC.Internal.Control.Monad.ST.Imp as ST
|
| ... | ... | @@ -210,10 +209,6 @@ fixST m = ST (\ s -> |
| 210 | 209 | -- itself is demanded directly in the `let` body. See also
|
| 211 | 210 | -- Note [Lazy ST: not producing lazy pairs].
|
| 212 | 211 | |
| 213 | --- | @since base-2.01
|
|
| 214 | -instance MonadFix (ST s) where
|
|
| 215 | - mfix = fixST
|
|
| 216 | - |
|
| 217 | 212 | -- | @since base-4.23.0.0
|
| 218 | 213 | instance Semigroup a => Semigroup (ST s a) where
|
| 219 | 214 | (<>) = liftA2 (<>)
|
| ... | ... | @@ -33,7 +33,6 @@ module GHC.Internal.Data.Functor.Identity ( |
| 33 | 33 | Identity(..),
|
| 34 | 34 | ) where
|
| 35 | 35 | |
| 36 | -import GHC.Internal.Control.Monad.Fix
|
|
| 37 | 36 | import GHC.Internal.Data.Bits (Bits, FiniteBits)
|
| 38 | 37 | import GHC.Internal.Data.Coerce
|
| 39 | 38 | import GHC.Internal.Data.Foldable
|
| ... | ... | @@ -143,7 +142,3 @@ instance Applicative Identity where |
| 143 | 142 | -- | @since base-4.8.0.0
|
| 144 | 143 | instance Monad Identity where
|
| 145 | 144 | m >>= k = k (runIdentity m) |
| 146 | - |
|
| 147 | --- | @since base-4.8.0.0
|
|
| 148 | -instance MonadFix Identity where
|
|
| 149 | - mfix f = Identity (fix (runIdentity . f)) |
| ... | ... | @@ -20,7 +20,6 @@ module GHC.Internal.System.IO ( |
| 20 | 20 | -- * The IO monad
|
| 21 | 21 | |
| 22 | 22 | IO,
|
| 23 | - fixIO,
|
|
| 24 | 23 | |
| 25 | 24 | -- * Files and handles
|
| 26 | 25 | |
| ... | ... | @@ -258,7 +257,6 @@ import GHC.Internal.IO.Encoding |
| 258 | 257 | import GHC.Internal.Text.Read
|
| 259 | 258 | import GHC.Internal.IO.StdHandles
|
| 260 | 259 | import GHC.Internal.Show
|
| 261 | -import GHC.Internal.MVar
|
|
| 262 | 260 | -----------------------------------------------------------------------------
|
| 263 | 261 | -- Standard IO
|
| 264 | 262 | |
| ... | ... | @@ -602,87 +600,6 @@ hReady h = hWaitForInput h 0 |
| 602 | 600 | hPrint :: Show a => Handle -> a -> IO ()
|
| 603 | 601 | hPrint hdl = hPutStrLn hdl . show
|
| 604 | 602 | |
| 605 | - |
|
| 606 | --- ---------------------------------------------------------------------------
|
|
| 607 | --- fixIO
|
|
| 608 | - |
|
| 609 | --- | The implementation of 'Control.Monad.Fix.mfix' for 'IO'.
|
|
| 610 | ---
|
|
| 611 | --- This operation may fail with:
|
|
| 612 | ---
|
|
| 613 | --- * 'FixIOException' if the function passed to 'fixIO' inspects its argument.
|
|
| 614 | ---
|
|
| 615 | --- ==== __Examples__
|
|
| 616 | ---
|
|
| 617 | --- the IO-action is only executed once. The recursion is only on the values.
|
|
| 618 | ---
|
|
| 619 | --- >>> take 3 <$> fixIO (\x -> putStr ":D" >> (:x) <$> readLn @Int)
|
|
| 620 | --- :D
|
|
| 621 | --- 2
|
|
| 622 | --- [2,2,2]
|
|
| 623 | ---
|
|
| 624 | --- If we are strict in the value, just as with 'Data.Function.fix', we do not get termination:
|
|
| 625 | ---
|
|
| 626 | --- >>> fixIO (\x -> putStr x >> pure ('x' : x))
|
|
| 627 | --- * hangs forever *
|
|
| 628 | ---
|
|
| 629 | --- We can tie the knot of a structure within 'IO' using 'fixIO':
|
|
| 630 | ---
|
|
| 631 | --- @
|
|
| 632 | --- data Node = MkNode Int (IORef Node)
|
|
| 633 | ---
|
|
| 634 | --- foo :: IO ()
|
|
| 635 | --- foo = do
|
|
| 636 | --- p \<- fixIO (\p -> newIORef (MkNode 0 p))
|
|
| 637 | --- q <- output p
|
|
| 638 | --- r <- output q
|
|
| 639 | --- _ <- output r
|
|
| 640 | --- pure ()
|
|
| 641 | ---
|
|
| 642 | --- output :: IORef Node -> IO (IORef Node)
|
|
| 643 | --- output ref = do
|
|
| 644 | --- MkNode x p <- readIORef ref
|
|
| 645 | --- print x
|
|
| 646 | --- pure p
|
|
| 647 | --- @
|
|
| 648 | ---
|
|
| 649 | --- >>> foo
|
|
| 650 | --- 0
|
|
| 651 | --- 0
|
|
| 652 | --- 0
|
|
| 653 | -fixIO :: (a -> IO a) -> IO a
|
|
| 654 | -fixIO k = do
|
|
| 655 | - m <- newEmptyMVar
|
|
| 656 | - ans <- unsafeDupableInterleaveIO
|
|
| 657 | - (readMVar m `catch` \BlockedIndefinitelyOnMVar ->
|
|
| 658 | - throwIO FixIOException)
|
|
| 659 | - result <- k ans
|
|
| 660 | - putMVar m result
|
|
| 661 | - return result
|
|
| 662 | - |
|
| 663 | --- Note [Blackholing in fixIO]
|
|
| 664 | --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 665 | --- We do our own explicit black holing here, because GHC's lazy
|
|
| 666 | --- blackholing isn't enough. In an infinite loop, GHC may run the IO
|
|
| 667 | --- computation a few times before it notices the loop, which is wrong.
|
|
| 668 | ---
|
|
| 669 | --- NOTE2: the explicit black-holing with an IORef ran into trouble
|
|
| 670 | --- with multiple threads (see #5421), so now we use an MVar. We used
|
|
| 671 | --- to use takeMVar with unsafeInterleaveIO. This, however, uses noDuplicate#,
|
|
| 672 | --- which is not particularly cheap. Better to use readMVar, which can be
|
|
| 673 | --- performed in multiple threads safely, and to use unsafeDupableInterleaveIO
|
|
| 674 | --- to avoid the noDuplicate cost.
|
|
| 675 | ---
|
|
| 676 | --- What we'd ideally want is probably an IVar, but we don't quite have those.
|
|
| 677 | --- STM TVars look like an option at first, but I don't think they are:
|
|
| 678 | --- we'd need to be able to write to the variable in an IO context, which can
|
|
| 679 | --- only be done using 'atomically', and 'atomically' is not allowed within
|
|
| 680 | --- unsafePerformIO. We can't know if someone will try to use the result
|
|
| 681 | --- of fixIO with unsafePerformIO!
|
|
| 682 | ---
|
|
| 683 | --- See also System.IO.Unsafe.unsafeFixIO.
|
|
| 684 | ---
|
|
| 685 | - |
|
| 686 | 603 | -- | The function creates a temporary file in ReadWrite mode.
|
| 687 | 604 | -- The created file isn\'t deleted automatically, so you need to delete it manually.
|
| 688 | 605 | --
|
| ... | ... | @@ -28,13 +28,8 @@ import Data.Data hiding (Fixity(..)) |
| 28 | 28 | import Data.IORef
|
| 29 | 29 | import System.IO.Unsafe ( unsafePerformIO )
|
| 30 | 30 | import Control.Monad.IO.Class (MonadIO (..))
|
| 31 | -import Control.Monad.Fix (MonadFix (..))
|
|
| 32 | -import Control.Exception (BlockedIndefinitelyOnMVar (..), catch, throwIO)
|
|
| 33 | -import Control.Exception.Base (FixIOException (..))
|
|
| 34 | -import Control.Concurrent.MVar (newEmptyMVar, readMVar, putMVar)
|
|
| 35 | 31 | import System.IO ( hPutStrLn, stderr )
|
| 36 | 32 | import qualified Data.Kind as Kind (Type)
|
| 37 | -import GHC.IO.Unsafe ( unsafeDupableInterleaveIO )
|
|
| 38 | 33 | import GHC.Types (TYPE, RuntimeRep(..))
|
| 39 | 34 | #else
|
| 40 | 35 | import GHC.Internal.Base hiding (NonEmpty(..),Type, Module, sequence)
|
| ... | ... | @@ -46,12 +41,8 @@ import GHC.Internal.Data.Foldable |
| 46 | 41 | import GHC.Internal.Data.Typeable
|
| 47 | 42 | import GHC.Internal.Control.Monad.IO.Class
|
| 48 | 43 | import GHC.Internal.Control.Monad.Fail
|
| 49 | -import GHC.Internal.Control.Monad.Fix
|
|
| 50 | -import GHC.Internal.Control.Exception
|
|
| 51 | 44 | import GHC.Internal.Num
|
| 52 | 45 | import GHC.Internal.IO.Unsafe
|
| 53 | -import GHC.Internal.MVar
|
|
| 54 | -import GHC.Internal.IO.Exception
|
|
| 55 | 46 | import qualified GHC.Internal.Types as Kind (Type)
|
| 56 | 47 | #endif
|
| 57 | 48 | import GHC.Internal.ForeignSrcLang
|
| ... | ... | @@ -258,22 +249,6 @@ instance Semigroup a => Semigroup (Q a) where |
| 258 | 249 | instance Monoid a => Monoid (Q a) where
|
| 259 | 250 | mempty = pure mempty
|
| 260 | 251 | |
| 261 | --- | If the function passed to 'mfix' inspects its argument,
|
|
| 262 | --- the resulting action will throw a 'FixIOException'.
|
|
| 263 | ---
|
|
| 264 | --- @since 2.17.0.0
|
|
| 265 | -instance MonadFix Q where
|
|
| 266 | - -- We use the same blackholing approach as in fixIO.
|
|
| 267 | - -- See Note [Blackholing in fixIO] in System.IO in base.
|
|
| 268 | - mfix k = do
|
|
| 269 | - m <- runIO newEmptyMVar
|
|
| 270 | - ans <- runIO (unsafeDupableInterleaveIO
|
|
| 271 | - (readMVar m `catch` \BlockedIndefinitelyOnMVar ->
|
|
| 272 | - throwIO FixIOException))
|
|
| 273 | - result <- k ans
|
|
| 274 | - runIO (putMVar m result)
|
|
| 275 | - return result
|
|
| 276 | - |
|
| 277 | 252 | |
| 278 | 253 | -----------------------------------------------------
|
| 279 | 254 | --
|
| ... | ... | @@ -41,10 +41,10 @@ data Tuple2 a b = (,) a b |
| 41 | 41 | -- Defined in ‘GHC.Internal.Tuple’
|
| 42 | 42 | instance Traversable (Tuple2 a)
|
| 43 | 43 | -- Defined in ‘GHC.Internal.Data.Traversable’
|
| 44 | -instance Foldable (Tuple2 a)
|
|
| 45 | - -- Defined in ‘GHC.Internal.Data.Foldable’
|
|
| 46 | 44 | instance Monoid a => Applicative (Tuple2 a)
|
| 47 | 45 | -- Defined in ‘GHC.Internal.Base’
|
| 46 | +instance Foldable (Tuple2 a)
|
|
| 47 | + -- Defined in ‘GHC.Internal.Data.Foldable’
|
|
| 48 | 48 | instance Functor (Tuple2 a) -- Defined in ‘GHC.Internal.Base’
|
| 49 | 49 | instance Monoid a => Monad (Tuple2 a)
|
| 50 | 50 | -- Defined in ‘GHC.Internal.Base’
|
| ... | ... | @@ -44,8 +44,8 @@ instance Traversable Maybe |
| 44 | 44 | -- Defined in ‘GHC.Internal.Data.Traversable’
|
| 45 | 45 | instance MonadFail Maybe
|
| 46 | 46 | -- Defined in ‘GHC.Internal.Control.Monad.Fail’
|
| 47 | -instance Foldable Maybe -- Defined in ‘GHC.Internal.Data.Foldable’
|
|
| 48 | 47 | instance Applicative Maybe -- Defined in ‘GHC.Internal.Base’
|
| 48 | +instance Foldable Maybe -- Defined in ‘GHC.Internal.Data.Foldable’
|
|
| 49 | 49 | instance Functor Maybe -- Defined in ‘GHC.Internal.Base’
|
| 50 | 50 | instance Monad Maybe -- Defined in ‘GHC.Internal.Base’
|
| 51 | 51 | instance Semigroup a => Monoid (Maybe a)
|
| ... | ... | @@ -11553,6 +11553,7 @@ instance forall e. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Data.Ei |
| 11553 | 11553 | instance forall r. GHC.Internal.Control.Monad.Fix.MonadFix ((->) r) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11554 | 11554 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.First -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11555 | 11555 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Types.IO -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11556 | +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11556 | 11557 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.Last -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11557 | 11558 | instance GHC.Internal.Control.Monad.Fix.MonadFix [] -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11558 | 11559 | instance forall (f :: * -> *) i (c :: GHC.Internal.Generics.Meta). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.M1 i c f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| ... | ... | @@ -11560,14 +11561,14 @@ instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Maybe.Maybe -- Def |
| 11560 | 11561 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Base.NonEmpty -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11561 | 11562 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Generics.Par1 -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11562 | 11563 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Product -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11564 | +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.TH.Monad.Q -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11563 | 11565 | instance forall (f :: * -> *). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.Rec1 f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11566 | +instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11564 | 11567 | instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.ST.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11565 | 11568 | instance GHC.Internal.Control.Monad.Fix.MonadFix Solo -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11566 | 11569 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Sum -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11567 | 11570 | instance forall a. GHC.Internal.Base.Monoid a => GHC.Internal.Control.Monad.Fix.MonadFix ((,) a) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11568 | -instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.ST.Lazy.Imp’
|
|
| 11569 | 11571 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Complex.Complex -- Defined in ‘Data.Complex’
|
| 11570 | -instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
|
| 11571 | 11572 | instance [safe] forall (f :: * -> *) (g :: * -> *). (GHC.Internal.Control.Monad.Fix.MonadFix f, GHC.Internal.Control.Monad.Fix.MonadFix g) => GHC.Internal.Control.Monad.Fix.MonadFix (Data.Functor.Product.Product f g) -- Defined in ‘Data.Functor.Product’
|
| 11572 | 11573 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.First -- Defined in ‘Data.Semigroup’
|
| 11573 | 11574 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.Last -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -11580,6 +11580,7 @@ instance forall e. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Data.Ei |
| 11580 | 11580 | instance forall r. GHC.Internal.Control.Monad.Fix.MonadFix ((->) r) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11581 | 11581 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.First -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11582 | 11582 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Types.IO -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11583 | +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11583 | 11584 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.Last -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11584 | 11585 | instance GHC.Internal.Control.Monad.Fix.MonadFix [] -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11585 | 11586 | instance forall (f :: * -> *) i (c :: GHC.Internal.Generics.Meta). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.M1 i c f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| ... | ... | @@ -11587,14 +11588,14 @@ instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Maybe.Maybe -- Def |
| 11587 | 11588 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Base.NonEmpty -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11588 | 11589 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Generics.Par1 -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11589 | 11590 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Product -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11591 | +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.TH.Monad.Q -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11590 | 11592 | instance forall (f :: * -> *). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.Rec1 f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11593 | +instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11591 | 11594 | instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.ST.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11592 | 11595 | instance GHC.Internal.Control.Monad.Fix.MonadFix Solo -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11593 | 11596 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Sum -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11594 | 11597 | instance forall a. GHC.Internal.Base.Monoid a => GHC.Internal.Control.Monad.Fix.MonadFix ((,) a) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11595 | -instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.ST.Lazy.Imp’
|
|
| 11596 | 11598 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Complex.Complex -- Defined in ‘Data.Complex’
|
| 11597 | -instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
|
| 11598 | 11599 | instance [safe] forall (f :: * -> *) (g :: * -> *). (GHC.Internal.Control.Monad.Fix.MonadFix f, GHC.Internal.Control.Monad.Fix.MonadFix g) => GHC.Internal.Control.Monad.Fix.MonadFix (Data.Functor.Product.Product f g) -- Defined in ‘Data.Functor.Product’
|
| 11599 | 11600 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.First -- Defined in ‘Data.Semigroup’
|
| 11600 | 11601 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.Last -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -11811,6 +11811,7 @@ instance forall e. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Data.Ei |
| 11811 | 11811 | instance forall r. GHC.Internal.Control.Monad.Fix.MonadFix ((->) r) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11812 | 11812 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.First -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11813 | 11813 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Types.IO -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11814 | +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11814 | 11815 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.Last -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11815 | 11816 | instance GHC.Internal.Control.Monad.Fix.MonadFix [] -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11816 | 11817 | instance forall (f :: * -> *) i (c :: GHC.Internal.Generics.Meta). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.M1 i c f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| ... | ... | @@ -11818,14 +11819,14 @@ instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Maybe.Maybe -- Def |
| 11818 | 11819 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Base.NonEmpty -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11819 | 11820 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Generics.Par1 -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11820 | 11821 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Product -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11822 | +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.TH.Monad.Q -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11821 | 11823 | instance forall (f :: * -> *). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.Rec1 f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11824 | +instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11822 | 11825 | instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.ST.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11823 | 11826 | instance GHC.Internal.Control.Monad.Fix.MonadFix Solo -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11824 | 11827 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Sum -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11825 | 11828 | instance forall a. GHC.Internal.Base.Monoid a => GHC.Internal.Control.Monad.Fix.MonadFix ((,) a) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11826 | -instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.ST.Lazy.Imp’
|
|
| 11827 | 11829 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Complex.Complex -- Defined in ‘Data.Complex’
|
| 11828 | -instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
|
| 11829 | 11830 | instance [safe] forall (f :: * -> *) (g :: * -> *). (GHC.Internal.Control.Monad.Fix.MonadFix f, GHC.Internal.Control.Monad.Fix.MonadFix g) => GHC.Internal.Control.Monad.Fix.MonadFix (Data.Functor.Product.Product f g) -- Defined in ‘Data.Functor.Product’
|
| 11830 | 11831 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.First -- Defined in ‘Data.Semigroup’
|
| 11831 | 11832 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.Last -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -11553,6 +11553,7 @@ instance forall e. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Data.Ei |
| 11553 | 11553 | instance forall r. GHC.Internal.Control.Monad.Fix.MonadFix ((->) r) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11554 | 11554 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.First -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11555 | 11555 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Types.IO -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11556 | +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11556 | 11557 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.Last -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11557 | 11558 | instance GHC.Internal.Control.Monad.Fix.MonadFix [] -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11558 | 11559 | instance forall (f :: * -> *) i (c :: GHC.Internal.Generics.Meta). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.M1 i c f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| ... | ... | @@ -11560,14 +11561,14 @@ instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Maybe.Maybe -- Def |
| 11560 | 11561 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Base.NonEmpty -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11561 | 11562 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Generics.Par1 -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11562 | 11563 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Product -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11564 | +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.TH.Monad.Q -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11563 | 11565 | instance forall (f :: * -> *). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.Rec1 f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11566 | +instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
|
| 11564 | 11567 | instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.ST.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11565 | 11568 | instance GHC.Internal.Control.Monad.Fix.MonadFix Solo -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11566 | 11569 | instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Sum -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11567 | 11570 | instance forall a. GHC.Internal.Base.Monoid a => GHC.Internal.Control.Monad.Fix.MonadFix ((,) a) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
|
| 11568 | -instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.ST.Lazy.Imp’
|
|
| 11569 | 11571 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Complex.Complex -- Defined in ‘Data.Complex’
|
| 11570 | -instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
|
| 11571 | 11572 | instance [safe] forall (f :: * -> *) (g :: * -> *). (GHC.Internal.Control.Monad.Fix.MonadFix f, GHC.Internal.Control.Monad.Fix.MonadFix g) => GHC.Internal.Control.Monad.Fix.MonadFix (Data.Functor.Product.Product f g) -- Defined in ‘Data.Functor.Product’
|
| 11572 | 11573 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.First -- Defined in ‘Data.Semigroup’
|
| 11573 | 11574 | instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.Last -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -5,5 +5,5 @@ cyclic evaluation in fixIO |
| 5 | 5 | While handling thread blocked indefinitely in an MVar operation
|
| 6 | 6 | |
| 7 | 7 | HasCallStack backtrace:
|
| 8 | - throwIO, called at libraries/ghc-internal/src/GHC/Internal/System/IO.hs:641:37 in ghc-internal:GHC.Internal.System.IO
|
|
| 8 | + throwIO, called at libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fix.hs:167:37 in ghc-internal:GHC.Internal.Control.Monad.Fix
|
|
| 9 | 9 |