{-# LANGUAGE Trustworthy #-}{-# LANGUAGE NoImplicitPrelude #-}{-# LANGUAGE TypeOperators #-}------------------------------------------------------------------------------- |-- Module : Control.Monad.Fix-- Copyright : (c) Andy Gill 2001,-- (c) Oregon Graduate Institute of Science and Technology, 2002-- License : BSD-style (see the file libraries/base/LICENSE)-- Maintainer : libraries@haskell.org-- Stability : experimental-- Portability : portable---- Monadic fixpoints.---- For a detailed discussion, see Levent Erkok's thesis,-- /Value Recursion in Monadic Computations/, Oregon Graduate Institute, 2002.-------------------------------------------------------------------------------moduleControl.Monad.Fix(MonadFix (mfix ),fix )whereimportData.Either importData.Function (fix )importData.Maybe importData.Monoid (Dual (..),Sum (..),Product (..),First (..),Last (..),Alt (..))importGHC.Base (Monad ,errorWithoutStackTrace ,(. ))importGHC.Generics importGHC.List (head ,tail )importGHC.ST importSystem.IO -- | Monads having fixed points with a \'knot-tying\' semantics.-- Instances of 'MonadFix' should satisfy the following laws:---- [/purity/]-- @'mfix' ('return' . h) = 'return' ('fix' h)@---- [/left shrinking/ (or /tightening/)]-- @'mfix' (\\x -> a >>= \\y -> f x y) = a >>= \\y -> 'mfix' (\\x -> f x y)@---- [/sliding/]-- @'mfix' ('Control.Monad.liftM' h . f) = 'Control.Monad.liftM' h ('mfix' (f . h))@,-- for strict @h@.---- [/nesting/]-- @'mfix' (\\x -> 'mfix' (\\y -> f x y)) = 'mfix' (\\x -> f x x)@---- This class is used in the translation of the recursive @do@ notation-- supported by GHC and Hugs.class(Monad m )=>MonadFix m where-- | The fixed point of a monadic computation.-- @'mfix' f@ executes the action @f@ only once, with the eventual-- output fed back as the input. Hence @f@ should not be strict,-- for then @'mfix' f@ would diverge.mfix::(a ->m a )->m a -- Instances of MonadFix for Prelude monads-- | @since 2.01instanceMonadFix Maybe wheremfix f =leta =f (unJust a )ina whereunJust (Just x )=x unJustNothing =errorWithoutStackTrace "mfix Maybe: Nothing"-- | @since 2.01instanceMonadFix []wheremfix f =casefix (f . head )of[]->[](x :_)->x :mfix (tail . f )-- | @since 2.01instanceMonadFix IOwheremfix =fixIO -- | @since 2.01instanceMonadFix ((->)r )wheremfix f =\r ->leta =f a r ina -- | @since 4.3.0.0instanceMonadFix (Either e )wheremfix f =leta =f (unRight a )ina whereunRight (Right x )=x unRight(Left _)=errorWithoutStackTrace "mfix Either: Left"-- | @since 2.01instanceMonadFix (ST s )wheremfix =fixST -- Instances of Data.Monoid wrappers-- | @since 4.8.0.0instanceMonadFix Dual wheremfix f =Dual (fix (getDual. f ))-- | @since 4.8.0.0instanceMonadFix Sum wheremfix f =Sum (fix (getSum. f ))-- | @since 4.8.0.0instanceMonadFix Product wheremfix f =Product (fix (getProduct. f ))-- | @since 4.8.0.0instanceMonadFix First wheremfix f =First (mfix (getFirst. f ))-- | @since 4.8.0.0instanceMonadFix Last wheremfix f =Last (mfix (getLast. f ))-- | @since 4.8.0.0instanceMonadFix f =>MonadFix (Alt f )wheremfix f =Alt (mfix (getAlt. f ))-- Instances for GHC.Generics-- | @since 4.9.0.0instanceMonadFix Par1 wheremfix f =Par1 (fix (unPar1. f ))-- | @since 4.9.0.0instanceMonadFix f =>MonadFix (Rec1 f )wheremfix f =Rec1 (mfix (unRec1. f ))-- | @since 4.9.0.0instanceMonadFix f =>MonadFix (M1 i c f )wheremfix f =M1 (mfix (unM1. f ))-- | @since 4.9.0.0instance(MonadFix f ,MonadFix g )=>MonadFix (f :*:g )wheremfix f =(mfix (fstP . f )):*: (mfix (sndP . f ))wherefstP (a :*: _)=a sndP (_:*: b )=b 

AltStyle によって変換されたページ (->オリジナル) /