Control/Monad/Random/Class.hs

{-# LANGUAGE MultiParamTypeClasses, UndecidableInstances, FunctionalDependencies #-}

{- |
Copyright : 2006-2007 Cale Gibbard, Russell O'Connor, Dan Doel, Remi Turk, Eric Kidd.
License : OtherLicense
Stability : experimental
Portability : non-portable (multi-parameter type classes, undecidable instances)

A type class for random number generation monads. See
<http://www.haskell.org/haskellwiki/NewMonads/MonadRandom> for the original
version of this code.

Instances of this type class include 'Control.Monad.Random.Rand' and
monads created using 'Control.Monad.Random.RandT'.

-}

module Control.Monad.Random.Class (
 MonadRandom,
 getRandom,
 getRandomR,
 getRandoms,
 getRandomRs,
 MonadSplit,
 getSplit
 ) where

import System.Random

-- | An interface to random number generation monads.
class (Monad m) => MonadRandom m where
 -- | Return a randomly-selected value of type @a@. See
 -- 'System.Random.random' for details.
 getRandom :: (Random a) => m a
 -- | Return an infinite stream of random values of type @a@. See
 -- 'System.Random.randoms' for details.
 getRandoms :: (Random a) => m [a]
 -- | Return a randomly-selected value of type @a@ in the range
 -- /[lo,hi]/. See 'System.Random.randomR' for details.
 getRandomR :: (Random a) => (a,a) -> m a
 -- | Return an infinite stream of randomly-selected value of type @a@
 -- in the range /[lo,hi]/. See 'System.Random.randomRs' for details.
 getRandomRs :: (Random a) => (a,a) -> m [a]

-- | An interface to monads with splittable state (as most random number generation monads will have).
-- The intention is that the 'getSplit' action splits the state, returning one half of the result, and
-- setting the new state to the other.
class (Monad m) => MonadSplit s m | m -> s where
 getSplit :: m s

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