Movatterモバイル変換


[0]ホーム

URL:


{-# LANGUAGE Unsafe #-}{-# LANGUAGE NoImplicitPrelude, MagicHash, UnboxedTuples, RankNTypes #-}{-# OPTIONS_HADDOCK hide #-}------------------------------------------------------------------------------- |-- Module      :  GHC.ST-- Copyright   :  (c) The University of Glasgow, 1992-2002-- License     :  see libraries/base/LICENSE---- Maintainer  :  cvs-ghc@haskell.org-- Stability   :  internal-- Portability :  non-portable (GHC Extensions)---- The 'ST' Monad.-------------------------------------------------------------------------------moduleGHC.ST(ST(..),STret(..),STRep,runST,-- * Unsafe functionsliftST,unsafeInterleaveST,unsafeDupableInterleaveST)whereimportGHC.BaseimportGHC.ShowimportqualifiedControl.Monad.FailasFaildefault()-- The state-transformer monad proper.  By default the monad is strict;-- too many people got bitten by space leaks when it was lazy.-- | The strict state-transformer monad.-- A computation of type @'ST' s a@ transforms an internal state indexed-- by @s@, and returns a value of type @a@.-- The @s@ parameter is either---- * an uninstantiated type variable (inside invocations of 'runST'), or---- * 'RealWorld' (inside invocations of 'Control.Monad.ST.stToIO').---- It serves to keep the internal states of different invocations-- of 'runST' separate from each other and from invocations of-- 'Control.Monad.ST.stToIO'.---- The '>>=' and '>>' operations are strict in the state (though not in-- values stored in the state).  For example,---- @'runST' (writeSTRef _|_ v >>= f) = _|_@newtypeSTsa=ST(STRepsa)typeSTRepsa=State#s->(#State#s,a#)-- | @since 2.01instanceFunctor(STs)wherefmapf(STm)=ST$\s->case(ms)of{(#new_s,r#)->(#new_s,fr#)}-- | @since 4.4.0.0instanceApplicative(STs)where{-# INLINEpure#-}{-# INLINE(*>)#-}purex=ST(\s->(#s,x#))m*>k=m>>=\_->k(<*>)=apliftA2=liftM2-- | @since 2.01instanceMonad(STs)where{-# INLINE(>>=)#-}(>>)=(*>)(STm)>>=k=ST(\s->case(ms)of{(#new_s,r#)->case(kr)of{STk2->(k2new_s)}})-- | @since 4.11.0.0instanceFail.MonadFail(STs)wherefails=errorWithoutStackTraces-- | @since 4.11.0.0instanceSemigroupa=>Semigroup(STsa)where(<>)=liftA2(<>)-- | @since 4.11.0.0instanceMonoida=>Monoid(STsa)wheremempty=purememptydataSTretsa=STret(State#s)a-- liftST is useful when we want a lifted result from an ST computation.liftST::STsa->State#s->STretsaliftST(STm)=\s->casemsof(#s',r#)->STrets'rnoDuplicateST::STs()noDuplicateST=ST$\s->(#noDuplicate#s,()#)-- | 'unsafeInterleaveST' allows an 'ST' computation to be deferred-- lazily.  When passed a value of type @ST a@, the 'ST' computation will-- only be performed when the value of the @a@ is demanded.{-# INLINEunsafeInterleaveST#-}unsafeInterleaveST::STsa->STsaunsafeInterleaveSTm=unsafeDupableInterleaveST(noDuplicateST>>m)-- | 'unsafeDupableInterleaveST' allows an 'ST' computation to be deferred-- lazily.  When passed a value of type @ST a@, the 'ST' computation will-- only be performed when the value of the @a@ is demanded.---- The computation may be performed multiple times by different threads,-- possibly at the same time. To prevent this, use 'unsafeInterleaveST' instead.---- @since 4.11{-# NOINLINEunsafeDupableInterleaveST#-}-- See Note [unsafeDupableInterleaveIO should not be inlined]-- in GHC.IO.UnsafeunsafeDupableInterleaveST::STsa->STsaunsafeDupableInterleaveST(STm)=ST(\s->letr=casemsof(#_,res#)->resin(#s,r#))-- | @since 2.01instanceShow(STsa)whereshowsPrec__=showString"<<ST action>>"showList=showList__(showsPrec0){-# INLINErunST#-}-- | Return the value computed by a state transformer computation.-- The @forall@ ensures that the internal state used by the 'ST'-- computation is inaccessible to the rest of the program.runST::(foralls.STsa)->arunST(STst_rep)=caserunRW#st_repof(#_,a#)->a-- See Note [Definition of runRW#] in GHC.Magic

[8]ページ先頭

©2009-2025 Movatter.jp