Date: Sunday, March 6, 2022 @ 20:02:24 Author: felixonmars Revision: 1144017
upgpkg: haskell-random-fu 0.3.0.0-1: rebuild with rvar 0.3.0.0, random-fu 0.3.0.0 Modified: haskell-random-fu/trunk/PKGBUILD Deleted: haskell-random-fu/trunk/ghc9.patch ------------+ PKGBUILD | 17 ghc9.patch | 1744 ----------------------------------------------------------- 2 files changed, 5 insertions(+), 1756 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2022-03-06 20:01:33 UTC (rev 1144016) +++ PKGBUILD 2022-03-06 20:02:24 UTC (rev 1144017) @@ -2,25 +2,18 @@ _hkgname=random-fu pkgname=haskell-random-fu -pkgver=0.2.7.7 -pkgrel=111 +pkgver=0.3.0.0 +pkgrel=1 pkgdesc="Random number generation" url="https://github.com/mokus0/random-fu" license=("custom:PublicDomain") arch=('x86_64') depends=('ghc-libs' 'haskell-erf' 'haskell-math-functions' 'haskell-monad-loops' 'haskell-random' - 'haskell-random-shuffle' 'haskell-random-source' 'haskell-rvar' 'haskell-syb' - 'haskell-vector') + 'haskell-random-shuffle' 'haskell-rvar' 'haskell-syb' 'haskell-vector') makedepends=('ghc') -source=("https://hackage.haskell.org/packages/archive/$_hkgname/$pkgver/$_hkgname-$pkgver.tar.gz" - ghc9.patch) -sha256sums=('8466bcfb5290bdc30a571c91e1eb526c419ea9773bc118996778b516cfc665ca' - 'b96a87ecadea4d1897b3250b43445d22a56fef90ae12645d573e6c92456e921f') +source=("https://hackage.haskell.org/packages/archive/$_hkgname/$pkgver/$_hkgname-$pkgver.tar.gz") +sha256sums=('a19d158d0f2b6df51d32c9e6df7cf6bbd94b7a1af81acfb4fe505f410e5ae4c7') -prepare() { - patch -d $_hkgname-$pkgver -p2 < ghc9.patch -} - build() { cd $_hkgname-$pkgver Deleted: ghc9.patch =================================================================== --- ghc9.patch 2022-03-06 20:01:33 UTC (rev 1144016) +++ ghc9.patch 2022-03-06 20:02:24 UTC (rev 1144017) @@ -1,1744 +0,0 @@ -From 268e66b778157e64f508d9d2018f8252034cc14d Mon Sep 17 00:00:00 2001 -From: Alexey Kuleshevich <[email protected]> -Date: Sat, 3 Apr 2021 23:20:22 +0300 -Subject: [PATCH 1/3] Remove trailing whitespaces and switch to newer lts - ---- - random-fu/src/Data/Random/Distribution.hs | 40 +++---- - .../src/Data/Random/Distribution/Bernoulli.hs | 10 +- - .../Data/Random/Distribution/Categorical.hs | 52 ++++----- - .../src/Data/Random/Distribution/Dirichlet.hs | 2 +- - random-fu/src/Data/Random/Distribution/F.hs | 1 - - .../src/Data/Random/Distribution/Gamma.hs | 13 ++- - .../Data/Random/Distribution/Multinomial.hs | 4 +- - .../src/Data/Random/Distribution/Normal.hs | 42 ++++---- - .../src/Data/Random/Distribution/Rayleigh.hs | 4 +- - .../Data/Random/Distribution/Triangular.hs | 4 +- - .../src/Data/Random/Distribution/Ziggurat.hs | 100 +++++++++--------- - random-fu/src/Data/Random/Internal/Find.hs | 16 +-- - random-fu/src/Data/Random/Internal/Fixed.hs | 4 +- - random-fu/src/Data/Random/Internal/TH.hs | 27 +++-- - random-fu/src/Data/Random/Lift.hs | 5 +- - random-fu/src/Data/Random/List.hs | 5 +- - random-fu/src/Data/Random/RVar.hs | 2 +- - random-fu/src/Data/Random/Sample.hs | 4 +- - rvar/src/Data/RVar.hs | 58 +++++----- - stack.yaml | 10 +- - tests/speed/Bench.hs | 16 +-- - tests/speed/speed-tests.cabal | 2 +- - 22 files changed, 210 insertions(+), 211 deletions(-) - -diff --git a/random-fu/src/Data/Random/Distribution.hs b/random-fu/src/Data/Random/Distribution.hs -index 15ece3c..0c460f3 100644 ---- a/random-fu/src/Data/Random/Distribution.hs -+++ b/random-fu/src/Data/Random/Distribution.hs -@@ -13,7 +13,7 @@ import Data.Random.RVar - -- > data Normal a - -- > = StdNormal - -- > | Normal a a ---- -+-- - -- Where the two parameters of the 'Normal' data constructor are the mean and - -- standard deviation of the random variable, respectively. To make use of - -- the 'Normal' type, one can convert it to an 'rvar' and manipulate it or -@@ -21,39 +21,39 @@ import Data.Random.RVar - -- - -- > x <- sample (rvar (Normal 10 2)) - -- > x <- sample (Normal 10 2) ---- -+-- - -- A 'Distribution' is typically more transparent than an 'RVar' ---- but less composable (precisely because of that transparency). There are -+-- but less composable (precisely because of that transparency). There are - -- several practical uses for types implementing 'Distribution': ---- ---- * Typically, a 'Distribution' will expose several parameters of a standard -+-- -+-- * Typically, a 'Distribution' will expose several parameters of a standard - -- mathematical model of a probability distribution, such as mean and std deviation for - -- the normal distribution. Thus, they can be manipulated analytically using - -- mathematical insights about the distributions they represent. For example, - -- a collection of bernoulli variables could be simplified into a (hopefully) smaller - -- collection of binomial variables. ---- -+-- - -- * Because they are generally just containers for parameters, they can be ---- easily serialized to persistent storage or read from user-supplied -+-- easily serialized to persistent storage or read from user-supplied - -- configurations (eg, initialization data for a simulation). ---- -+-- - -- * If a type additionally implements the 'CDF' subclass, which extends - -- 'Distribution' with a cumulative density function, an arbitrary random - -- variable 'x' can be tested against the distribution by testing - -- @fmap (cdf dist) x@ for uniformity. ---- -+-- - -- On the other hand, most 'Distribution's will not be closed under all the - -- same operations as 'RVar' (which, being a monad, has a fully turing-complete ---- internal computational model). The sum of two uniformly-distributed ---- variables, for example, is not uniformly distributed. To support general ---- composition, the 'Distribution' class defines a function 'rvar' to ---- construct the more-abstract and more-composable 'RVar' representation -+-- internal computational model). The sum of two uniformly-distributed -+-- variables, for example, is not uniformly distributed. To support general -+-- composition, the 'Distribution' class defines a function 'rvar' to -+-- construct the more-abstract and more-composable 'RVar' representation - -- of a random variable. - class Distribution d t where - -- |Return a random variable with this distribution. - rvar :: d t -> RVar t - rvar = rvarT -- -+ - -- |Return a random variable with the given distribution, pre-lifted to an arbitrary 'RVarT'. - -- Any arbitrary 'RVar' can also be converted to an 'RVarT m' for an arbitrary 'm', using - -- either 'lift' or 'sample'. -@@ -66,7 +66,7 @@ class Distribution d t => PDF d t where - pdf d = exp . logPdf d - logPdf :: d t -> t -> Double - logPdf d = log . pdf d -- -+ - - class Distribution d t => CDF d t where - -- |Return the cumulative distribution function of this distribution. -@@ -76,19 +76,19 @@ class Distribution d t => CDF d t where - -- - -- In the case where 't' is an instance of Ord, 'cdf' should correspond - -- to the CDF with respect to that order. -- -- -+ -- - -- In other cases, 'cdf' is only required to satisfy the following law: - -- @fmap (cdf d) (rvar d)@ - -- must be uniformly distributed over (0,1). Inclusion of either endpoint is optional, - -- though the preferred range is (0,1]. -- -- -- -- Note that this definition requires that 'cdf' for a product type -- -- should _not_ be a joint CDF as commonly defined, as that definition -+ -- -+ -- Note that this definition requires that 'cdf' for a product type -+ -- should _not_ be a joint CDF as commonly defined, as that definition - -- violates both conditions. - -- Instead, it should be a univariate CDF over the product type. That is, - -- it should represent the CDF with respect to the lexicographic order - -- of the product. -- -- -+ -- - -- The present specification is probably only really useful for testing - -- conformance of a variable to its target distribution, and I am open to - -- suggestions for more-useful specifications (especially with regard to -diff --git a/random-fu/src/Data/Random/Distribution/Bernoulli.hs b/random-fu/src/Data/Random/Distribution/Bernoulli.hs -index 446916a..1027fd8 100644 ---- a/random-fu/src/Data/Random/Distribution/Bernoulli.hs -+++ b/random-fu/src/Data/Random/Distribution/Bernoulli.hs -@@ -57,7 +57,7 @@ generalBernoulliCDF gte f t p x - - newtype Bernoulli b a = Bernoulli b - --instance (Fractional b, Ord b, Distribution StdUniform b) -+instance (Fractional b, Ord b, Distribution StdUniform b) - => Distribution (Bernoulli b) Bool - where - rvarT (Bernoulli p) = boolBernoulli p -@@ -67,7 +67,7 @@ instance (Distribution (Bernoulli b) Bool, Real b) - cdf (Bernoulli p) = boolBernoulliCDF p - - $( replicateInstances ''Int integralTypes [d| -- instance Distribution (Bernoulli b) Bool -+ instance Distribution (Bernoulli b) Bool - => Distribution (Bernoulli b) Int - where - rvarT (Bernoulli p) = generalBernoulli 0 1 p -@@ -78,7 +78,7 @@ $( replicateInstances ''Int integralTypes [d| - |] ) - - $( replicateInstances ''Float realFloatTypes [d| -- instance Distribution (Bernoulli b) Bool -+ instance Distribution (Bernoulli b) Bool - => Distribution (Bernoulli b) Float - where - rvarT (Bernoulli p) = generalBernoulli 0 1 p -@@ -89,11 +89,11 @@ $( replicateInstances ''Float realFloatTypes [d| - |] ) - - instance (Distribution (Bernoulli b) Bool, Integral a) -- => Distribution (Bernoulli b) (Ratio a) -+ => Distribution (Bernoulli b) (Ratio a) - where - rvarT (Bernoulli p) = generalBernoulli 0 1 p - instance (CDF (Bernoulli b) Bool, Integral a) -- => CDF (Bernoulli b) (Ratio a) -+ => CDF (Bernoulli b) (Ratio a) - where - cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p - instance (Distribution (Bernoulli b) Bool, RealFloat a) -diff --git a/random-fu/src/Data/Random/Distribution/Categorical.hs b/random-fu/src/Data/Random/Distribution/Categorical.hs -index 10051d1..575a0a2 100644 ---- a/random-fu/src/Data/Random/Distribution/Categorical.hs -+++ b/random-fu/src/Data/Random/Distribution/Categorical.hs -@@ -37,7 +37,7 @@ import qualified Data.Vector.Mutable as MV - categorical :: (Num p, Distribution (Categorical p) a) => [(p,a)] -> RVar a - categorical = rvar . fromList - ---- |Construct a 'Categorical' random process from a list of probabilities -+-- |Construct a 'Categorical' random process from a list of probabilities - -- and categories, where the probabilities all sum to 1. - categoricalT :: (Num p, Distribution (Categorical p) a) => [(p,a)] -> RVarT m a - categoricalT = rvarT . fromList -@@ -47,7 +47,7 @@ categoricalT = rvarT . fromList - weightedCategorical :: (Fractional p, Eq p, Distribution (Categorical p) a) => [(p,a)] -> RVar a - weightedCategorical = rvar . fromWeightedList - ---- |Construct a 'Categorical' random process from a list of weights -+-- |Construct a 'Categorical' random process from a list of weights - -- and categories. The weights do /not/ have to sum to 1. - weightedCategoricalT :: (Fractional p, Eq p, Distribution (Categorical p) a) => [(p,a)] -> RVarT m a - weightedCategoricalT = rvarT . fromWeightedList -@@ -73,14 +73,14 @@ totalWeight (Categorical ds) - numEvents :: Categorical p a -> Int - numEvents (Categorical ds) = V.length ds - ---- |Construct a 'Categorical' distribution from a list of weighted categories, -+-- |Construct a 'Categorical' distribution from a list of weighted categories, - -- where the weights do not necessarily sum to 1. - fromWeightedList :: (Fractional p, Eq p) => [(p,a)] -> Categorical p a - fromWeightedList = normalizeCategoricalPs . fromList - - -- |Construct a 'Categorical' distribution from a list of observed outcomes. - -- Equivalent events will be grouped and counted, and the probabilities of each ---- event in the returned distribution will be proportional to the number of -+-- event in the returned distribution will be proportional to the number of - -- occurrences of that event. - fromObservations :: (Fractional p, Eq p, Ord a) => [a] -> Categorical p a - fromObservations = fromWeightedList . map (genericLength &&& head) . group . sort -@@ -91,10 +91,10 @@ fromObservations = fromWeightedList . map (genericLength &&& head) . group . sor - -- binary search. - - -- |Categorical distribution; a list of events with corresponding probabilities. ---- The sum of the probabilities must be 1, and no event should have a zero -+-- The sum of the probabilities must be 1, and no event should have a zero - -- or negative probability (at least, at time of sampling; very clever users ---- can do what they want with the numbers before sampling, just make sure ---- that if you're one of those clever ones, you at least eliminate negative -+-- can do what they want with the numbers before sampling, just make sure -+-- that if you're one of those clever ones, you at least eliminate negative - -- weights before sampling). - newtype Categorical p a = Categorical (V.Vector (p, a)) - deriving Eq -@@ -117,19 +117,19 @@ instance (Fractional p, Ord p, Distribution Uniform p) => Distribution (Categori - | n == 1 = return (snd (V.head ds)) - | otherwise = do - u <- uniformT 0 (fst (V.last ds)) -- -+ - let -- by construction, p is monotone; (i < j) ==> (p i <= p j) - p i = fst (ds V.! i) - x i = snd (ds V.! i) -- -+ - -- findEvent - -- =========== - -- invariants: (i <= j), (u <= p j), ((i == 0) || (p i < u)) - -- (the last one means 'i' does not increase unless it bounds 'p' below 'u') - -- variant: either i increases or j decreases. - -- upon termination: ∀ k. if (k < j) then (p k < u) else (u <= p k) -- -- (that is, the chosen event 'x j' is the first one whose -- -- associated cumulative probability 'p j' is greater than -+ -- (that is, the chosen event 'x j' is the first one whose -+ -- associated cumulative probability 'p j' is greater than - -- or equal to 'u') - findEvent i j - | j <= i = x j -@@ -139,7 +139,7 @@ instance (Fractional p, Ord p, Distribution Uniform p) => Distribution (Categori - -- midpoint rounding down - -- (i < j) ==> (m < j) - m = (i + j) `div` 2 -- -+ - return $! if u <= 0 then x 0 else findEvent 0 (n-1) - where n = V.length ds - -@@ -156,22 +156,22 @@ instance Traversable (Categorical p) where - - instance Fractional p => Monad (Categorical p) where - return x = Categorical (V.singleton (1, x)) -- -+ - -- I'm not entirely sure whether this is a valid form of failure; see next - -- set of comments. - #if __GLASGOW_HASKELL__ < 808 - fail _ = Categorical V.empty - #endif -- -+ - -- Should the normalize step be included here, or should normalization - -- be assumed? It seems like there is (at least) 1 valid situation where -- -- non-normal results would arise: the distribution being modeled is -- -- "conditional" and some event arose that contradicted the assumed -- -- condition and thus was eliminated ('f' returned an empty or -+ -- non-normal results would arise: the distribution being modeled is -+ -- "conditional" and some event arose that contradicted the assumed -+ -- condition and thus was eliminated ('f' returned an empty or - -- zero-probability consequent, possibly by 'fail'ing). -- -- -+ -- - -- It seems reasonable to continue in such circumstances, but should there -- -- be any renormalization? If so, does it make a difference when that -+ -- be any renormalization? If so, does it make a difference when that - -- renormalization is done? I'm pretty sure it does, actually. So, the - -- normalization will be omitted here for now, as it's easier for the - -- user (who really better know what they mean if they're returning -@@ -180,7 +180,7 @@ instance Fractional p => Monad (Categorical p) where - xs >>= f = {- normalizeCategoricalPs . -} fromList $ do - (p, x) <- toList xs - (q, y) <- toList (f x) -- -+ - return (p * q, y) - - instance Fractional p => Applicative (Categorical p) where -@@ -191,7 +191,7 @@ instance Fractional p => Applicative (Categorical p) where - mapCategoricalPs :: (Num p, Num q) => (p -> q) -> Categorical p e -> Categorical q e - mapCategoricalPs f = fromList . map (first f) . toList - ---- |Adjust all the weights of a categorical distribution so that they -+-- |Adjust all the weights of a categorical distribution so that they - -- sum to unity and remove all events whose probability is zero. - normalizeCategoricalPs :: (Fractional p, Eq p) => Categorical p e -> Categorical p e - normalizeCategoricalPs orig@(Categorical ds) -@@ -200,13 +200,13 @@ normalizeCategoricalPs orig@(Categorical ds) - lastP <- newSTRef 0 - nDups <- newSTRef 0 - normalized <- V.thaw ds -- -+ - let n = V.length ds - skip = modifySTRef' nDups (1+) - save i p x = do - d <- readSTRef nDups - MV.write normalized (i-d) (p, x) -- -+ - sequence_ - [ do - let (p,x) = ds V.! i -@@ -218,7 +218,7 @@ normalizeCategoricalPs orig@(Categorical ds) - writeSTRef lastP $! p - | i <- [0..n-1] - ] -- -+ - -- force last element to 1 - d <- readSTRef nDups - let n' = n-d -@@ -242,14 +242,14 @@ modifySTRef' x f = do - -- event will have a probability equal to the sum of all the originals). - collectEvents :: (Ord e, Num p, Ord p) => Categorical p e -> Categorical p e - collectEvents = collectEventsBy compare ((sum *** head) . unzip) -- -+ - -- |Simplify a categorical distribution by combining equivalent events (the new - -- event will have a weight equal to the sum of all the originals). - -- The comparator function is used to identify events to combine. Once chosen, - -- the events and their weights are combined by the provided probability and - -- event aggregation function. - collectEventsBy :: Num p => (e -> e -> Ordering) -> ([(p,e)] -> (p,e))-> Categorical p e -> Categorical p e --collectEventsBy compareE combine = -+collectEventsBy compareE combine = - fromList . map combine . groupEvents . sortEvents . toList - where - groupEvents = groupBy (\x y -> snd x `compareE` snd y == EQ) -diff --git a/random-fu/src/Data/Random/Distribution/Dirichlet.hs b/random-fu/src/Data/Random/Distribution/Dirichlet.hs -index 3388ff8..7dbc4cc 100644 ---- a/random-fu/src/Data/Random/Distribution/Dirichlet.hs -+++ b/random-fu/src/Data/Random/Distribution/Dirichlet.hs -@@ -18,7 +18,7 @@ fractionalDirichlet [_] = return [1] - fractionalDirichlet as = do - xs <- sequence [gammaT a 1 | a <- as] - let total = foldl1' (+) xs -- -+ - return (map (* recip total) xs) - - dirichlet :: Distribution Dirichlet [a] => [a] -> RVar [a] -diff --git a/random-fu/src/Data/Random/Distribution/Gamma.hs b/random-fu/src/Data/Random/Distribution/Gamma.hs -index ef89a44..bd27050 100644 ---- a/random-fu/src/Data/Random/Distribution/Gamma.hs -+++ b/random-fu/src/Data/Random/Distribution/Gamma.hs -@@ -9,10 +9,10 @@ - module Data.Random.Distribution.Gamma - ( Gamma(..) - , gamma, gammaT -- -+ - , Erlang(..) - , erlang, erlangT -- -+ - , mtGamma - ) where - -@@ -31,10 +31,10 @@ import Numeric.SpecFunctions - {-# SPECIALIZE mtGamma :: Float -> Float -> RVarT m Float #-} - mtGamma - :: (Floating a, Ord a, -- Distribution StdUniform a, -+ Distribution StdUniform a, - Distribution Normal a) - => a -> a -> RVarT m a --mtGamma a b -+mtGamma a b - | a < 1 = do - u <- stdUniformT - mtGamma (1+a) $! (b * u ** recip a) -@@ -42,11 +42,11 @@ mtGamma a b - where - !d = a - fromRational (1%3) - !c = recip (sqrt (9*d)) -- -+ - go = do - x <- stdNormalT - let !v = 1 + c*x -- -+ - if v <= 0 - then go - else do -@@ -89,4 +89,3 @@ instance (Integral a, Floating b, Ord b, Distribution Normal b, Distribution Std - - instance (Integral a, Real b, Distribution (Erlang a) b) => CDF (Erlang a) b where - cdf (Erlang a) x = incompleteGamma (fromIntegral a) (realToFrac x) -- -diff --git a/random-fu/src/Data/Random/Distribution/Multinomial.hs b/random-fu/src/Data/Random/Distribution/Multinomial.hs -index 6e8971a..af4c9fa 100644 ---- a/random-fu/src/Data/Random/Distribution/Multinomial.hs -+++ b/random-fu/src/Data/Random/Distribution/Multinomial.hs -@@ -24,9 +24,9 @@ instance (Num a, Eq a, Fractional p, Distribution (Binomial p) a) => Distributio - go n (p:ps) (psum:psums) f = do - x <- binomialT n (p / psum) - go (n-x) ps psums (f . (x:)) -- -+ - go _ _ _ _ = error "rvar/Multinomial: programming error! this case should be impossible!" -- -+ - -- less wasteful version of (map sum . tails) - tailSums [] = [0] - tailSums (x:xs) = case tailSums xs of -diff --git a/random-fu/src/Data/Random/Distribution/Normal.hs b/random-fu/src/Data/Random/Distribution/Normal.hs -index 960414a..90b9e11 100644 ---- a/random-fu/src/Data/Random/Distribution/Normal.hs -+++ b/random-fu/src/Data/Random/Distribution/Normal.hs -@@ -1,6 +1,6 @@ - {-# LANGUAGE - MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, -- UndecidableInstances, ForeignFunctionInterface, BangPatterns, -+ UndecidableInstances, ForeignFunctionInterface, BangPatterns, - RankNTypes - #-} - -@@ -10,13 +10,13 @@ module Data.Random.Distribution.Normal - ( Normal(..) - , normal, normalT - , stdNormal, stdNormalT -- -+ - , doubleStdNormal - , floatStdNormal - , realFloatStdNormal -- -+ - , normalTail -- -+ - , normalPair - , boxMullerNormalPair - , knuthPolarNormalPair -@@ -44,7 +44,7 @@ normalPair = boxMullerNormalPair - - -- |A random variable that produces a pair of independent - -- normally-distributed values, computed using the Box-Muller method. ---- This algorithm is slightly slower than Knuth's method but using a -+-- This algorithm is slightly slower than Knuth's method but using a - -- constant amount of entropy (Knuth's method is a rejection method). - -- It is also slightly more general (Knuth's method require an 'Ord' - -- instance). -@@ -55,27 +55,27 @@ boxMullerNormalPair = do - t <- stdUniform - let r = sqrt (-2 * log u) - theta = (2 * pi) * t -- -+ - x = r * cos theta - y = r * sin theta - return (x,y) - - -- |A random variable that produces a pair of independent - -- normally-distributed values, computed using Knuth's polar method. ---- Slightly faster than 'boxMullerNormalPair' when it accepts on the -+-- Slightly faster than 'boxMullerNormalPair' when it accepts on the - -- first try, but does not always do so. - {-# INLINE knuthPolarNormalPair #-} - knuthPolarNormalPair :: (Floating a, Ord a, Distribution Uniform a) => RVar (a,a) - knuthPolarNormalPair = do - v1 <- uniform (-1) 1 - v2 <- uniform (-1) 1 -- -+ - let s = v1*v1 + v2*v2 - if s >= 1 - then knuthPolarNormalPair - else return $ if s == 0 - then (0,0) -- else let scale = sqrt (-2 * log s / s) -+ else let scale = sqrt (-2 * log s / s) - in (v1 * scale, v2 * scale) - - -- |Draw from the tail of a normal distribution (the region beyond the provided value) -@@ -110,7 +110,7 @@ normalFInv :: Floating a => a -> a - normalFInv y = sqrt ((-2) * log y) - -- | integral of 'normalF' - normalFInt :: (Floating a, Erf a, Ord a) => a -> a --normalFInt x -+normalFInt x - | x <= 0 = 0 - | otherwise = normalFVol * erf (x * sqrt 0.5) - -- | volume of 'normalF' -@@ -120,8 +120,8 @@ normalFVol = sqrt (0.5 * pi) - -- |A random variable sampling from the standard normal distribution - -- over any 'RealFloat' type (subject to the rest of the constraints - - -- it builds and uses a 'Ziggurat' internally, which requires the 'Erf' ---- class). ---- -+-- class). -+-- - -- Because it computes a 'Ziggurat', it is very expensive to use for - -- just one evaluation, or even for multiple evaluations if not used and - -- reused monomorphically (to enable the ziggurat table to be let-floated -@@ -135,10 +135,10 @@ normalFVol = sqrt (0.5 * pi) - -- @Distribution Normal@ instance declaration. - realFloatStdNormal :: (RealFloat a, Erf a, Distribution Uniform a) => RVarT m a - realFloatStdNormal = runZiggurat (normalZ p getIU `asTypeOf` (undefined :: Ziggurat V.Vector a)) -- where -+ where - p :: Int - p = 6 -- -+ - getIU :: (Num a, Distribution Uniform a) => RVarT m (Int, a) - getIU = do - i <- getRandomWord8 -@@ -159,12 +159,12 @@ doubleStdNormalV = 2.4567663515413507e-3 - - {-# NOINLINE doubleStdNormalZ #-} - doubleStdNormalZ :: Ziggurat UV.Vector Double --doubleStdNormalZ = mkZiggurat_ True -- normalF normalFInv -- doubleStdNormalC doubleStdNormalR doubleStdNormalV -+doubleStdNormalZ = mkZiggurat_ True -+ normalF normalFInv -+ doubleStdNormalC doubleStdNormalR doubleStdNormalV - getIU - (normalTail doubleStdNormalR) -- where -+ where - getIU :: RVarT m (Int, Double) - getIU = do - !w <- getRandomWord64 -@@ -185,9 +185,9 @@ floatStdNormalV = 2.4567663515413507e-3 - - {-# NOINLINE floatStdNormalZ #-} - floatStdNormalZ :: Ziggurat UV.Vector Float --floatStdNormalZ = mkZiggurat_ True -- normalF normalFInv -- floatStdNormalC floatStdNormalR floatStdNormalV -+floatStdNormalZ = mkZiggurat_ True -+ normalF normalFInv -+ floatStdNormalC floatStdNormalR floatStdNormalV - getIU - (normalTail floatStdNormalR) - where -diff --git a/random-fu/src/Data/Random/Distribution/Rayleigh.hs b/random-fu/src/Data/Random/Distribution/Rayleigh.hs -index c3d16a5..94ab61f 100644 ---- a/random-fu/src/Data/Random/Distribution/Rayleigh.hs -+++ b/random-fu/src/Data/Random/Distribution/Rayleigh.hs -@@ -1,5 +1,5 @@ - {-# LANGUAGE -- MultiParamTypeClasses, -+ MultiParamTypeClasses, - FlexibleInstances, FlexibleContexts, - UndecidableInstances - #-} -@@ -19,7 +19,7 @@ floatingRayleigh s = do - - -- |The rayleigh distribution with a specified mode (\"sigma\") parameter. - -- Its mean will be @sigma*sqrt(pi/2)@ and its variance will be @sigma^2*(4-pi)/2@ ---- -+-- - -- (therefore if you want one with a particular mean @m@, @sigma@ should be @m*sqrt(2/pi)@) - newtype Rayleigh a = Rayleigh a - -diff --git a/random-fu/src/Data/Random/Distribution/Triangular.hs b/random-fu/src/Data/Random/Distribution/Triangular.hs -index 4653f39..272c5a7 100644 ---- a/random-fu/src/Data/Random/Distribution/Triangular.hs -+++ b/random-fu/src/Data/Random/Distribution/Triangular.hs -@@ -52,8 +52,8 @@ triangularCDF a b c x - = realToFrac (1 - (c - x)^(2 :: Int) / ((c - a) * (c - b))) - | otherwise - = 1 -- -+ - instance (RealFloat a, Ord a, Distribution StdUniform a) => Distribution Triangular a where - rvarT (Triangular a b c) = floatingTriangular a b c - instance (RealFrac a, Distribution Triangular a) => CDF Triangular a where -- cdf (Triangular a b c) = triangularCDF a b c -\ No newline at end of file -+ cdf (Triangular a b c) = triangularCDF a b c -diff --git a/random-fu/src/Data/Random/Distribution/Ziggurat.hs b/random-fu/src/Data/Random/Distribution/Ziggurat.hs -index ca0e3e9..3d680d6 100644 ---- a/random-fu/src/Data/Random/Distribution/Ziggurat.hs -+++ b/random-fu/src/Data/Random/Distribution/Ziggurat.hs -@@ -7,16 +7,16 @@ - - -- |A generic \"ziggurat algorithm\" implementation. Fairly rough right - -- now. ---- -+-- - -- There is a lot of room for improvement in 'findBin0' especially. - -- It needs a fair amount of cleanup and elimination of redundant - -- calculation, as well as either a justification for using the simple ---- 'findMinFrom' or a proper root-finding algorithm. ---- ---- It would also be nice to add (preferably by pulling in an ---- external package) support for numerical integration and ---- differentiation, so that tables can be derived from only a ---- PDF (if the end user is willing to take the performance and -+-- 'findMinFrom' or a proper root-finding algorithm. -+-- -+-- It would also be nice to add (preferably by pulling in an -+-- external package) support for numerical integration and -+-- differentiation, so that tables can be derived from only a -+-- PDF (if the end user is willing to take the performance and - -- accuracy hit for the convenience). - module Data.Random.Distribution.Ziggurat - ( Ziggurat(..) -@@ -48,10 +48,10 @@ import qualified Data.Vector.Unboxed as UV - data Ziggurat v t = Ziggurat { - -- |The X locations of each bin in the distribution. Bin 0 is the - -- 'infinite' one. -- -- -+ -- - -- In the case of bin 0, the value given is sort of magical - x[0] is -- -- defined to be V/f(R). It's not actually the location of any bin, -- -- but a value computed to make the algorithm more concise and slightly -+ -- defined to be V/f(R). It's not actually the location of any bin, -+ -- but a value computed to make the algorithm more concise and slightly - -- faster by not needing to specially-handle bin 0 quite as often. - -- If you really need to know why it works, see the 'runZiggurat' - -- source or \"the literature\" - it's a fairly standard setup. -@@ -64,8 +64,8 @@ data Ziggurat v t = Ziggurat { - -- - -- * a bin index, uniform over [0,c) :: Int (where @c@ is the - -- number of bins in the tables) -- -- -- -- * a uniformly distributed fractional value, from -1 to 1 -+ -- -+ -- * a uniformly distributed fractional value, from -1 to 1 - -- if not mirrored, from 0 to 1 otherwise. - -- - -- This is provided as a single 'RVar' because it can be implemented -@@ -74,21 +74,21 @@ data Ziggurat v t = Ziggurat { - -- a double (using 52 bits) and a bin number (using up to 12 bits), - -- for example. - zGetIU :: !(forall m. RVarT m (Int, t)), -- -+ - -- |The distribution for the final \"virtual\" bin - -- (the ziggurat algorithm does not handle distributions - -- that wander off to infinity, so another distribution is needed - -- to handle the last \"bin\" that stretches to infinity) - zTailDist :: (forall m. RVarT m t), -- -+ - -- |A copy of the uniform RVar generator for the base type, - -- so that @Distribution Uniform t@ is not needed when sampling - -- from a Ziggurat (makes it a bit more self-contained). - zUniform :: !(forall m. t -> t -> RVarT m t), -- -+ - -- |The (one-sided antitone) PDF, not necessarily normalized - zFunc :: !(t -> t), -- -+ - -- |A flag indicating whether the distribution should be - -- mirrored about the origin (the ziggurat algorithm in - -- its native form only samples from one-sided distributions. -@@ -113,7 +113,7 @@ runZiggurat !Ziggurat{..} = go - -- (or 0 to 1 if not mirroring the distribution). - -- Let X be U scaled to the size of the selected bin. - (!i,!u) <- zGetIU -- -+ - -- if the uniform value U falls in the area "clearly inside" the - -- bin, accept X immediately. - -- Otherwise, depending on the bin selected, use either the -@@ -123,7 +123,7 @@ runZiggurat !Ziggurat{..} = go - else if i == 0 - then sampleTail u - else sampleGreyArea i $! (u * zTable_xs ! i) -- -+ - -- when the sample falls in the "grey area" (the area between - -- the Y values of the selected bin and the bin after that one), - -- use an accept/reject method based on the target PDF. -@@ -133,7 +133,7 @@ runZiggurat !Ziggurat{..} = go - if v < zFunc (abs x) - then return $! x - else go -- -+ - -- if the selected bin is the "infinite" one, call it quits and - -- defer to the tail distribution (mirroring if needed to ensure - -- the result has the sign already selected by zGetIU) -@@ -143,28 +143,28 @@ runZiggurat !Ziggurat{..} = go - | otherwise = zTailDist - - ---- |Build the tables to implement the \"ziggurat algorithm\" devised by -+-- |Build the tables to implement the \"ziggurat algorithm\" devised by - -- Marsaglia & Tang, attempting to automatically compute the R and V - -- values. ---- -+-- - -- Arguments: ---- -+-- - -- * flag indicating whether to mirror the distribution ---- -+-- - -- * the (one-sided antitone) PDF, not necessarily normalized ---- -+-- - -- * the inverse of the PDF ---- -+-- - -- * the number of bins ---- -+-- - -- * R, the x value of the first bin ---- -+-- - -- * V, the volume of each bin ---- -+-- - -- * an RVar providing the 'zGetIU' random tuple ---- -+-- - -- * an RVar sampling from the tail (the region where x > R) ---- -+-- - {-# INLINE mkZiggurat_ #-} - {-# SPECIALIZE mkZiggurat_ :: Bool -> (Float -> Float) -> (Float -> Float) -> Int -> Float -> Float -> (forall m. RVarT m (Int, Float)) -> (forall m. RVarT m Float ) -> Ziggurat UV.Vector Float #-} - {-# SPECIALIZE mkZiggurat_ :: Bool -> (Double -> Double) -> (Double -> Double) -> Int -> Double -> Double -> (forall m. RVarT m (Int, Double)) -> (forall m. RVarT m Double) -> Ziggurat UV.Vector Double #-} -@@ -191,13 +191,13 @@ mkZiggurat_ m f fInv c r v getIU tailDist = Ziggurat - , zTailDist = tailDist - , zMirror = m - } -- where -+ where - xs = zigguratTable f fInv c r v - ---- |Build the tables to implement the \"ziggurat algorithm\" devised by -+-- |Build the tables to implement the \"ziggurat algorithm\" devised by - -- Marsaglia & Tang, attempting to automatically compute the R and V - -- values. ---- -+-- - -- Arguments are the same as for 'mkZigguratRec', with an additional - -- argument for the tail distribution as a function of the selected - -- R value. -@@ -213,15 +213,15 @@ mkZiggurat :: (RealFloat t, Vector v t, - -> (forall m. t -> RVarT m t) - -> Ziggurat v t - mkZiggurat m f fInv fInt fVol c getIU tailDist = -- mkZiggurat_ m f fInv c r v getIU (tailDist r) -+ mkZiggurat_ m f fInv c r v getIU (tailDist r) - where - (r,v) = findBin0 c f fInv fInt fVol - - -- |Build a lazy recursive ziggurat. Uses a lazily-constructed ziggurat - -- as its tail distribution (with another as its tail, ad nauseam). ---- -+-- - -- Arguments: ---- -+-- - -- * flag indicating whether to mirror the distribution - -- - -- * the (one-sided antitone) PDF, not necessarily normalized -@@ -254,7 +254,7 @@ mkZigguratRec m f fInv fInt fVol c getIU = z - fix g = g (fix g) - z = mkZiggurat m f fInv fInt fVol c getIU (fix (mkTail m f fInv fInt fVol c getIU z)) - --mkTail :: -+mkTail :: - (RealFloat a, Vector v a, Distribution Uniform a) => - Bool - -> (a -> a) -> (a -> a) -> (a -> a) -@@ -269,15 +269,15 @@ mkTail m f fInv fInt fVol c getIU typeRep nextTail r = do - return (x + r * signum x) - where - fIntR = fInt r -- -+ - f' x | x < 0 = f r - | otherwise = f (x+r) - fInv' = subtract r . fInv - fInt' x | x < 0 = 0 - | otherwise = fInt (x+r) - fIntR -- -+ - fVol' = fVol - fIntR -- -+ - - zigguratTable :: (Fractional a, Vector v a, Ord a) => - (a -> a) -> (a -> a) -> Int -> a -> a -> v a -@@ -292,17 +292,17 @@ zigguratXs f fInv c r v = (xs, excess) - where - xs = Prelude.map x [0..c] -- sample c x - ys = Prelude.map f xs -- -+ - x 0 = v / f r - x 1 = r - x i | i == c = 0 - x i | i > 1 = next (i-1) - x _ = error "zigguratXs: programming error! this case should be impossible!" -- -+ - next i = let x_i = xs!!i - in if x_i <= 0 then -1 else fInv (ys!!i + (v / x_i)) -- -- excess = xs!!(c-1) * (f 0 - ys !! (c-1)) - v -+ -+ excess = xs!!(c-1) * (f 0 - ys !! (c-1)) - v - - - precomputeRatios :: (Vector v a, Fractional a) => v a -> v a -@@ -314,7 +314,7 @@ precomputeRatios zTable_xs = generate (c-1) $ \i -> zTable_xs!(i+1) / zTable_xs! - -- Search the distribution for an appropriate R and V. - -- - -- Arguments: ---- -+-- - -- * Number of bins - -- - -- * target function (one-sided antitone PDF, not necessarily normalized) -@@ -326,20 +326,20 @@ precomputeRatios zTable_xs = generate (c-1) $ \i -> zTable_xs!(i+1) / zTable_xs! - -- * estimate of total volume under function (integral from 0 to infinity) - -- - -- Result: (R,V) --findBin0 :: (RealFloat b) => -+findBin0 :: (RealFloat b) => - Int -> (b -> b) -> (b -> b) -> (b -> b) -> b -> (b, b) - findBin0 cInt f fInv fInt fVol = (rMin,v rMin) - where - c = fromIntegral cInt - v r = r * f r + fVol - fInt r -- -+ - -- initial R guess: - r0 = findMin (\r -> v r <= fVol / c) - -- find a better R: -- rMin = findMinFrom r0 1 $ \r -> -- let e = exc r -+ rMin = findMinFrom r0 1 $ \r -> -+ let e = exc r - in e >= 0 && not (isNaN e) -- -+ - exc x = zigguratExcess f fInv cInt x (v x) - - instance (Num t, Ord t, Vector v t) => Distribution (Ziggurat v) t where -diff --git a/random-fu/src/Data/Random/Internal/Find.hs b/random-fu/src/Data/Random/Internal/Find.hs -index 2c61f0e..c14c576 100644 ---- a/random-fu/src/Data/Random/Internal/Find.hs -+++ b/random-fu/src/Data/Random/Internal/Find.hs -@@ -19,7 +19,7 @@ findMin = findMinFrom 0 1 - -- specified point with the specified stepsize, performs an exponential - -- search out from there until it finds an interval bracketing the - -- change-point of the predicate, and then performs a bisection search ---- to isolate the change point. Note that infinitely-divisible domains -+-- to isolate the change point. Note that infinitely-divisible domains - -- such as 'Rational' cannot be searched by this function because it does - -- not terminate until it reaches a point where further subdivision of the - -- interval has no effect. -@@ -33,31 +33,31 @@ findMinFrom z0 step1 p - -- a feasible answer - fixZero 0 = 0 - fixZero z = z -- -+ - -- preconditions: - -- not (p l) - -- 0 <= l < x -- ascend l x -+ ascend l x - | p x = bisect l x - | otherwise = ascend x $! 2*x-z0 -- -+ - -- preconditions: - -- p h - -- x < h <= 0 -- descend x h -+ descend x h - | p x = (descend $! 2*x-z0) x - | otherwise = bisect x h -- -+ - -- preconditions: - -- not (p l) - -- p h - -- l <= h -- bisect l h -+ bisect l h - | l /< h = h - | l /< mid || mid /< h - = if p mid then mid else h - | p mid = bisect l mid - | otherwise = bisect mid h -- where -+ where - a /< b = not (a < b) - mid = (l+h)*0.5 -diff --git a/random-fu/src/Data/Random/Internal/Fixed.hs b/random-fu/src/Data/Random/Internal/Fixed.hs -index 758dca4..5180203 100644 ---- a/random-fu/src/Data/Random/Internal/Fixed.hs -+++ b/random-fu/src/Data/Random/Internal/Fixed.hs -@@ -35,10 +35,10 @@ resolutionOf2 x = resolution (res x) - -- |The 'Fixed' type doesn't expose its constructors, but I need a way to - -- convert them to and from their raw representation in order to sample - -- them. As long as 'Fixed' is a newtype wrapping 'Integer', 'mkFixed' and ---- 'unMkFixed' as defined here will work. Both are implemented using -+-- 'unMkFixed' as defined here will work. Both are implemented using - -- 'unsafeCoerce'. - mkFixed :: Integer -> Fixed r - mkFixed = unsafeCoerce - - unMkFixed :: Fixed r -> Integer --unMkFixed = unsafeCoerce -\ No newline at end of file -+unMkFixed = unsafeCoerce -diff --git a/random-fu/src/Data/Random/Internal/TH.hs b/random-fu/src/Data/Random/Internal/TH.hs -index 7f28658..500b75b 100644 ---- a/random-fu/src/Data/Random/Internal/TH.hs -+++ b/random-fu/src/Data/Random/Internal/TH.hs -@@ -6,12 +6,12 @@ - -- to cover large numbers of types. I'm doing that rather than using - -- class contexts because most Distribution instances need to cover - -- multiple classes (such as Enum, Integral and Fractional) and that ---- can't be done easily because of overlap. ---- ---- I experimented a bit with a convoluted type-level classification ---- scheme, but I think this is simpler and easier to understand. It ---- makes the haddock docs more cluttered because of the combinatorial ---- explosion of instances, but overall I think it's just more sane than -+-- can't be done easily because of overlap. -+-- -+-- I experimented a bit with a convoluted type-level classification -+-- scheme, but I think this is simpler and easier to understand. It -+-- makes the haddock docs more cluttered because of the combinatorial -+-- explosion of instances, but overall I think it's just more sane than - -- anything else I've come up with yet. - module Data.Random.Internal.TH - ( replicateInstances -@@ -27,7 +27,7 @@ import Control.Monad - - -- |Names of standard 'Integral' types - integralTypes :: [Name] --integralTypes = -+integralTypes = - [ ''Integer - , ''Int, ''Int8, ''Int16, ''Int32, ''Int64 - , ''Word, ''Word8, ''Word16, ''Word32, ''Word64 -@@ -53,17 +53,17 @@ replaceName x y z - -- 'Dec's in @decls@ and substitute every instance of the 'Name' @standin@ with - -- each 'Name' in @types@, producing one copy of the 'Dec's in @decls@ for every - -- 'Name' in @types@. ---- -+-- - -- For example, 'Data.Random.Distribution.Uniform' has the following bit of TH code: ---- -+-- - -- @ $( replicateInstances ''Int integralTypes [d| @ ---- -+-- - -- @ instance Distribution Uniform Int where rvar (Uniform a b) = integralUniform a b @ ---- -+-- - -- @ instance CDF Uniform Int where cdf (Uniform a b) = integralUniformCDF a b @ ---- -+-- - -- @ |]) @ ---- -+-- - -- This code takes those 2 instance declarations and creates identical ones for - -- every type named in 'integralTypes'. - replicateInstances :: (Monad m, Data t) => Name -> [Name] -> m [t] -> m [t] -@@ -76,4 +76,3 @@ replicateInstances standin types getDecls = liftM concat $ sequence - ] - | t <- types - ] -- -diff --git a/random-fu/src/Data/Random/Lift.hs b/random-fu/src/Data/Random/Lift.hs -index f148cb1..658ac72 100644 ---- a/random-fu/src/Data/Random/Lift.hs -+++ b/random-fu/src/Data/Random/Lift.hs -@@ -19,10 +19,10 @@ import qualified Control.Monad.Identity as MTL - -- For instances where 'm' and 'n' have 'return'/'pure' defined, - -- these instances must satisfy - -- @lift (return x) == return x@. ---- -+-- - -- This form of 'lift' has an extremely general type and is used primarily to - -- support 'sample'. Its excessive generality is the main reason it's not ---- exported from "Data.Random". 'RVarT' is, however, an instance of -+-- exported from "Data.Random". 'RVarT' is, however, an instance of - -- 'T.MonadTrans', which in most cases is the preferred way - -- to do the lifting. - class Lift m n where -@@ -67,4 +67,3 @@ instance T.MonadTrans t => Lift MTL.Identity (t MTL.Identity) where - lift = T.lift - - #endif -- -diff --git a/random-fu/src/Data/Random/List.hs b/random-fu/src/Data/Random/List.hs -index 2398e9c..1770fac 100644 ---- a/random-fu/src/Data/Random/List.hs -+++ b/random-fu/src/Data/Random/List.hs -@@ -28,11 +28,11 @@ shuffleT :: [a] -> RVarT m [a] - shuffleT [] = return [] - shuffleT xs = do - is <- zipWithM (\_ i -> uniformT 0 i) (tail xs) [1..] -- -+ - return (SRS.shuffle xs (reverse is)) - - -- | A random variable that shuffles a list of a known length (or a list ---- prefix of the specified length). Useful for shuffling large lists when -+-- prefix of the specified length). Useful for shuffling large lists when - -- the length is known in advance. Avoids needing to traverse the list to - -- discover its length. Each ordering has equal probability. - shuffleN :: Int -> [a] -> RVar [a] -@@ -53,4 +53,3 @@ shuffleNofMT n m xs - is <- sequence [uniformT 0 i | i <- take n [m-1, m-2 ..1]] - return (take n $ SRS.shuffle (take m xs) is) - shuffleNofMT _ _ _ = error "shuffleNofMT: negative length specified" -- -diff --git a/random-fu/src/Data/Random/RVar.hs b/random-fu/src/Data/Random/RVar.hs -index 9ad0492..1e69672 100644 ---- a/random-fu/src/Data/Random/RVar.hs -+++ b/random-fu/src/Data/Random/RVar.hs -@@ -8,7 +8,7 @@ import Data.Random.Lift - import Data.Random.Internal.Source - import Data.RVar hiding (runRVarT) - ---- |Like 'runRVarTWith', but using an implicit lifting (provided by the -+-- |Like 'runRVarTWith', but using an implicit lifting (provided by the - -- 'Lift' class) - runRVarT :: (Lift n m, RandomSource m s) => RVarT n a -> s -> m a - runRVarT = runRVarTWith lift -diff --git a/random-fu/src/Data/Random/Sample.hs b/random-fu/src/Data/Random/Sample.hs -index 31069db..c1c730c 100644 ---- a/random-fu/src/Data/Random/Sample.hs -+++ b/random-fu/src/Data/Random/Sample.hs -@@ -1,6 +1,6 @@ - {-# LANGUAGE - MultiParamTypeClasses, -- FlexibleInstances, FlexibleContexts, -+ FlexibleInstances, FlexibleContexts, - IncoherentInstances - #-} - -@@ -8,7 +8,7 @@ - - module Data.Random.Sample where - --import Control.Monad.State -+import Control.Monad.State - import Data.Random.Distribution - import Data.Random.Lift - import Data.Random.RVar --- -2.32.0 - - -From 7583073ad112dee683bae892018b0e87a9caa6d1 Mon Sep 17 00:00:00 2001 -From: funketh <[email protected]> -Date: Thu, 6 May 2021 19:14:31 +0200 -Subject: [PATCH 2/3] fix GHC 9 support by manually expanding TH - ---- - random-fu/random-fu.cabal | 1 - - .../src/Data/Random/Distribution/Bernoulli.hs | 78 +++++++---- - .../src/Data/Random/Distribution/Beta.hs | 13 +- - .../src/Data/Random/Distribution/Binomial.hs | 125 +++++++++++++----- - .../Data/Random/Distribution/Categorical.hs | 2 - - .../src/Data/Random/Distribution/Poisson.hs | 105 +++++++++++---- - .../src/Data/Random/Distribution/Uniform.hs | 37 ++++-- - random-fu/src/Data/Random/Internal/TH.hs | 78 ----------- - 8 files changed, 267 insertions(+), 172 deletions(-) - delete mode 100644 random-fu/src/Data/Random/Internal/TH.hs - -diff --git a/random-fu/random-fu.cabal b/random-fu/random-fu.cabal -index e7e3db9..e76e464 100644 ---- a/random-fu/random-fu.cabal -+++ b/random-fu/random-fu.cabal -@@ -72,7 +72,6 @@ Library - Data.Random.Distribution.Ziggurat - Data.Random.Internal.Find - Data.Random.Internal.Fixed -- Data.Random.Internal.TH - Data.Random.Lift - Data.Random.List - Data.Random.RVar -diff --git a/random-fu/src/Data/Random/Distribution/Bernoulli.hs b/random-fu/src/Data/Random/Distribution/Bernoulli.hs -index 1027fd8..c6a3c79 100644 ---- a/random-fu/src/Data/Random/Distribution/Bernoulli.hs -+++ b/random-fu/src/Data/Random/Distribution/Bernoulli.hs -@@ -9,14 +9,14 @@ - - module Data.Random.Distribution.Bernoulli where - --import Data.Random.Internal.TH -- - import Data.Random.RVar - import Data.Random.Distribution - import Data.Random.Distribution.Uniform - - import Data.Ratio - import Data.Complex -+import Data.Int -+import Data.Word - - -- |Generate a Bernoulli variate with the given probability. For @Bool@ results, - -- @bernoulli p@ will return True (p*100)% of the time and False otherwise. -@@ -66,27 +66,59 @@ instance (Distribution (Bernoulli b) Bool, Real b) - where - cdf (Bernoulli p) = boolBernoulliCDF p - --$( replicateInstances ''Int integralTypes [d| -- instance Distribution (Bernoulli b) Bool -- => Distribution (Bernoulli b) Int -- where -- rvarT (Bernoulli p) = generalBernoulli 0 1 p -- instance CDF (Bernoulli b) Bool -- => CDF (Bernoulli b) Int -- where -- cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -- |] ) -- --$( replicateInstances ''Float realFloatTypes [d| -- instance Distribution (Bernoulli b) Bool -- => Distribution (Bernoulli b) Float -- where -- rvarT (Bernoulli p) = generalBernoulli 0 1 p -- instance CDF (Bernoulli b) Bool -- => CDF (Bernoulli b) Float -- where -- cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -- |] ) -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Integer where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Integer where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Int where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Int where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Int8 where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Int8 where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Int16 where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Int16 where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Int32 where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Int32 where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Int64 where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Int64 where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Word where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Word where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Word8 where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Word8 where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Word16 where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Word16 where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Word32 where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Word32 where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Word64 where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Word64 where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+ -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Float where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Float where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p -+instance Distribution (Bernoulli b) Bool => Distribution (Bernoulli b) Double where -+ rvarT (Bernoulli p) = generalBernoulli 0 1 p -+instance CDF (Bernoulli b) Bool => CDF (Bernoulli b) Double where -+ cdf (Bernoulli p) = generalBernoulliCDF (>=) 0 1 p - - instance (Distribution (Bernoulli b) Bool, Integral a) - => Distribution (Bernoulli b) (Ratio a) -diff --git a/random-fu/src/Data/Random/Distribution/Beta.hs b/random-fu/src/Data/Random/Distribution/Beta.hs -index 754f388..e07b2c0 100644 ---- a/random-fu/src/Data/Random/Distribution/Beta.hs -+++ b/random-fu/src/Data/Random/Distribution/Beta.hs -@@ -9,8 +9,6 @@ - - module Data.Random.Distribution.Beta where - --import Data.Random.Internal.TH -- - import Data.Random.RVar - import Data.Random.Distribution - import Data.Random.Distribution.Gamma -@@ -57,7 +55,10 @@ instance PDF Beta Float - where - pdf (Beta a b) = realToFrac . exp . logBetaPdf (realToFrac a) (realToFrac b) . realToFrac - --$( replicateInstances ''Float realFloatTypes [d| -- instance Distribution Beta Float -- where rvarT (Beta a b) = fractionalBeta a b -- |]) -+instance Distribution Beta Float -+ where -+ rvarT (Beta a b) = fractionalBeta a b -+ -+instance Distribution Beta Double -+ where -+ rvarT (Beta a b) = fractionalBeta a b -diff --git a/random-fu/src/Data/Random/Distribution/Binomial.hs b/random-fu/src/Data/Random/Distribution/Binomial.hs -index 802a6c8..8495a77 100644 ---- a/random-fu/src/Data/Random/Distribution/Binomial.hs -+++ b/random-fu/src/Data/Random/Distribution/Binomial.hs -@@ -9,13 +9,14 @@ - - module Data.Random.Distribution.Binomial where - --import Data.Random.Internal.TH -- - import Data.Random.RVar - import Data.Random.Distribution - import Data.Random.Distribution.Beta - import Data.Random.Distribution.Uniform - -+import Data.Int -+import Data.Word -+ - import Numeric.SpecFunctions ( stirlingError ) - import Numeric.SpecFunctions.Extra ( bd0 ) - import Numeric ( log1p ) -@@ -131,31 +132,95 @@ binomialT t p = rvarT (Binomial t p) - - data Binomial b a = Binomial a b - --$( replicateInstances ''Int integralTypes [d| -- instance ( Floating b, Ord b -- , Distribution Beta b -- , Distribution StdUniform b -- ) => Distribution (Binomial b) Int -- where -- rvarT (Binomial t p) = integralBinomial t p -- instance ( Real b , Distribution (Binomial b) Int -- ) => CDF (Binomial b) Int -- where cdf (Binomial t p) = integralBinomialCDF t p -- instance ( Real b , Distribution (Binomial b) Int -- ) => PDF (Binomial b) Int -- where pdf (Binomial t p) = integralBinomialPDF t p -- logPdf (Binomial t p) = integralBinomialLogPdf t p -- |]) -- --$( replicateInstances ''Float realFloatTypes [d| -- instance Distribution (Binomial b) Integer -- => Distribution (Binomial b) Float -- where rvar (Binomial t p) = floatingBinomial t p -- instance CDF (Binomial b) Integer -- => CDF (Binomial b) Float -- where cdf (Binomial t p) = floatingBinomialCDF t p -- instance PDF (Binomial b) Integer -- => PDF (Binomial b) Float -- where pdf (Binomial t p) = floatingBinomialPDF t p -- logPdf (Binomial t p) = floatingBinomialLogPDF t p -- |]) -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Integer where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Integer) => CDF (Binomial b) Integer where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Integer) => PDF (Binomial b) Integer where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Int where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Int) => CDF (Binomial b) Int where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Int) => PDF (Binomial b) Int where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Int8 where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Int8) => CDF (Binomial b) Int8 where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Int8) => PDF (Binomial b) Int8 where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Int16 where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Int16) => CDF (Binomial b) Int16 where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Int16) => PDF (Binomial b) Int16 where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Int32 where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Int32) => CDF (Binomial b) Int32 where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Int32) => PDF (Binomial b) Int32 where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Int64 where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Int64) => CDF (Binomial b) Int64 where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Int64) => PDF (Binomial b) Int64 where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Word where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Word) => CDF (Binomial b) Word where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Word) => PDF (Binomial b) Word where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Word8 where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Word8) => CDF (Binomial b) Word8 where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Word8) => PDF (Binomial b) Word8 where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Word16 where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Word16) => CDF (Binomial b) Word16 where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Word16) => PDF (Binomial b) Word16 where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Word32 where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Word32) => CDF (Binomial b) Word32 where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Word32) => PDF (Binomial b) Word32 where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+instance (Floating b, Ord b, Distribution Beta b, Distribution StdUniform b) => Distribution (Binomial b) Word64 where -+ rvarT (Binomial t p) = integralBinomial t p -+instance (Real b, Distribution (Binomial b) Word64) => CDF (Binomial b) Word64 where -+ cdf (Binomial t p) = integralBinomialCDF t p -+instance (Real b, Distribution (Binomial b) Word64) => PDF (Binomial b) Word64 where -+ pdf (Binomial t p) = integralBinomialPDF t p -+ logPdf (Binomial t p) = integralBinomialLogPdf t p -+ -+instance Distribution (Binomial b) Integer => Distribution (Binomial b) Float where -+ rvar (Binomial t p) = floatingBinomial t p -+instance CDF (Binomial b) Integer => CDF (Binomial b) Float where -+ cdf (Binomial t p) = floatingBinomialCDF t p -+instance PDF (Binomial b) Integer => PDF (Binomial b) Float where -+ pdf (Binomial t p) = floatingBinomialPDF t p -+ logPdf (Binomial t p) = floatingBinomialLogPDF t p -+instance Distribution (Binomial b) Integer => Distribution (Binomial b) Double where -+ rvar (Binomial t p) = floatingBinomial t p -+instance CDF (Binomial b) Integer => CDF (Binomial b) Double where -+ cdf (Binomial t p) = floatingBinomialCDF t p -+instance PDF (Binomial b) Integer => PDF (Binomial b) Double where -+ pdf (Binomial t p) = floatingBinomialPDF t p -+ logPdf (Binomial t p) = floatingBinomialLogPDF t p -diff --git a/random-fu/src/Data/Random/Distribution/Categorical.hs b/random-fu/src/Data/Random/Distribution/Categorical.hs -index 575a0a2..9980a4c 100644 ---- a/random-fu/src/Data/Random/Distribution/Categorical.hs -+++ b/random-fu/src/Data/Random/Distribution/Categorical.hs -@@ -23,9 +23,7 @@ import Data.Random.Distribution.Uniform - import Control.Arrow - import Control.Monad - import Control.Monad.ST --import Data.Foldable (Foldable(foldMap)) - import Data.STRef --import Data.Traversable (Traversable(traverse, sequenceA)) - - import Data.List - import Data.Function -diff --git a/random-fu/src/Data/Random/Distribution/Poisson.hs b/random-fu/src/Data/Random/Distribution/Poisson.hs -index 81bbec6..2613f49 100644 ---- a/random-fu/src/Data/Random/Distribution/Poisson.hs -+++ b/random-fu/src/Data/Random/Distribution/Poisson.hs -@@ -8,8 +8,6 @@ - - module Data.Random.Distribution.Poisson where - --import Data.Random.Internal.TH -- - import Data.Random.RVar - import Data.Random.Distribution - import Data.Random.Distribution.Uniform -@@ -18,6 +16,9 @@ import Data.Random.Distribution.Binomial - - import Control.Monad - -+import Data.Int -+import Data.Word -+ - -- from Knuth, with interpretation help from gsl sources - integralPoisson :: (Integral a, RealFloat b, Distribution StdUniform b, Distribution (Erlang a) b, Distribution (Binomial b) a) => b -> RVarT m a - integralPoisson = psn 0 -@@ -87,24 +88,82 @@ poissonT mu = rvarT (Poisson mu) - - newtype Poisson b a = Poisson b - --$( replicateInstances ''Int integralTypes [d| -- instance ( RealFloat b -- , Distribution StdUniform b -- , Distribution (Erlang Int) b -- , Distribution (Binomial b) Int -- ) => Distribution (Poisson b) Int where -- rvarT (Poisson mu) = integralPoisson mu -- instance (Real b, Distribution (Poisson b) Int) => CDF (Poisson b) Int where -- cdf (Poisson mu) = integralPoissonCDF mu -- instance (Real b, Distribution (Poisson b) Int) => PDF (Poisson b) Int where -- pdf (Poisson mu) = integralPoissonPDF mu -- |] ) -- --$( replicateInstances ''Float realFloatTypes [d| -- instance (Distribution (Poisson b) Integer) => Distribution (Poisson b) Float where -- rvarT (Poisson mu) = fractionalPoisson mu -- instance (CDF (Poisson b) Integer) => CDF (Poisson b) Float where -- cdf (Poisson mu) = fractionalPoissonCDF mu -- instance (PDF (Poisson b) Integer) => PDF (Poisson b) Float where -- pdf (Poisson mu) = fractionalPoissonPDF mu -- |]) -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Integer) b, Distribution (Binomial b) Integer) => Distribution (Poisson b) Integer where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Integer) => CDF (Poisson b) Integer where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Integer) => PDF (Poisson b) Integer where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Int) b, Distribution (Binomial b) Int) => Distribution (Poisson b) Int where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Int) => CDF (Poisson b) Int where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Int) => PDF (Poisson b) Int where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Int8) b, Distribution (Binomial b) Int8) => Distribution (Poisson b) Int8 where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Int8) => CDF (Poisson b) Int8 where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Int8) => PDF (Poisson b) Int8 where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Int16) b, Distribution (Binomial b) Int16) => Distribution (Poisson b) Int16 where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Int16) => CDF (Poisson b) Int16 where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Int16) => PDF (Poisson b) Int16 where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Int32) b, Distribution (Binomial b) Int32) => Distribution (Poisson b) Int32 where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Int32) => CDF (Poisson b) Int32 where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Int32) => PDF (Poisson b) Int32 where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Int64) b, Distribution (Binomial b) Int64) => Distribution (Poisson b) Int64 where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Int64) => CDF (Poisson b) Int64 where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Int64) => PDF (Poisson b) Int64 where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Word) b, Distribution (Binomial b) Word) => Distribution (Poisson b) Word where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Word) => CDF (Poisson b) Word where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Word) => PDF (Poisson b) Word where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Word8) b, Distribution (Binomial b) Word8) => Distribution (Poisson b) Word8 where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Word8) => CDF (Poisson b) Word8 where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Word8) => PDF (Poisson b) Word8 where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Word16) b, Distribution (Binomial b) Word16) => Distribution (Poisson b) Word16 where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Word16) => CDF (Poisson b) Word16 where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Word16) => PDF (Poisson b) Word16 where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Word32) b, Distribution (Binomial b) Word32) => Distribution (Poisson b) Word32 where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Word32) => CDF (Poisson b) Word32 where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Word32) => PDF (Poisson b) Word32 where -+ pdf (Poisson mu) = integralPoissonPDF mu -+instance (RealFloat b, Distribution StdUniform b, Distribution (Erlang Word64) b, Distribution (Binomial b) Word64) => Distribution (Poisson b) Word64 where -+ rvarT (Poisson mu) = integralPoisson mu -+instance (Real b, Distribution (Poisson b) Word64) => CDF (Poisson b) Word64 where -+ cdf (Poisson mu) = integralPoissonCDF mu -+instance (Real b, Distribution (Poisson b) Word64) => PDF (Poisson b) Word64 where -+ pdf (Poisson mu) = integralPoissonPDF mu -+ -+instance Distribution (Poisson b) Integer => Distribution (Poisson b) Float where -+ rvarT (Poisson mu) = fractionalPoisson mu -+instance CDF (Poisson b) Integer => CDF (Poisson b) Float where -+ cdf (Poisson mu) = fractionalPoissonCDF mu -+instance PDF (Poisson b) Integer => PDF (Poisson b) Float where -+ pdf (Poisson mu) = fractionalPoissonPDF mu -+instance Distribution (Poisson b) Integer => Distribution (Poisson b) Double where -+ rvarT (Poisson mu) = fractionalPoisson mu -+instance CDF (Poisson b) Integer => CDF (Poisson b) Double where -+ cdf (Poisson mu) = fractionalPoissonCDF mu -+instance PDF (Poisson b) Integer => PDF (Poisson b) Double where -+ pdf (Poisson mu) = fractionalPoissonPDF mu -diff --git a/random-fu/src/Data/Random/Distribution/Uniform.hs b/random-fu/src/Data/Random/Distribution/Uniform.hs -index a580fe8..74dd89a 100644 ---- a/random-fu/src/Data/Random/Distribution/Uniform.hs -+++ b/random-fu/src/Data/Random/Distribution/Uniform.hs -@@ -37,7 +37,6 @@ module Data.Random.Distribution.Uniform - , enumUniformCDF - ) where - --import Data.Random.Internal.TH - import Data.Random.Internal.Words - import Data.Random.Internal.Fixed - -@@ -284,10 +283,28 @@ data Uniform t = - -- (that is, 0 to 1 including 0 but not including 1). - data StdUniform t = StdUniform - --$( replicateInstances ''Int integralTypes [d| -- instance Distribution Uniform Int where rvarT (Uniform a b) = integralUniform a b -- instance CDF Uniform Int where cdf (Uniform a b) = integralUniformCDF a b -- |]) -+instance Distribution Uniform Integer where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Integer where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Int where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Int where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Int8 where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Int8 where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Int16 where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Int16 where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Int32 where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Int32 where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Int64 where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Int64 where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Word where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Word where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Word8 where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Word8 where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Word16 where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Word16 where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Word32 where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Word32 where cdf (Uniform a b) = integralUniformCDF a b -+instance Distribution Uniform Word64 where rvarT (Uniform a b) = integralUniform a b -+instance CDF Uniform Word64 where cdf (Uniform a b) = integralUniformCDF a b - - instance Distribution StdUniform Word8 where rvarT _ = getRandomWord8 - instance Distribution StdUniform Word16 where rvarT _ = getRandomWord16 -@@ -349,11 +366,13 @@ instance HasResolution r => - - instance Distribution Uniform () where rvarT (Uniform _ _) = return () - instance CDF Uniform () where cdf (Uniform _ _) = return 1 --$( replicateInstances ''Char [''Char, ''Bool, ''Ordering] [d| -- instance Distribution Uniform Char where rvarT (Uniform a b) = enumUniform a b -- instance CDF Uniform Char where cdf (Uniform a b) = enumUniformCDF a b - -- |]) -+instance Distribution Uniform Char where rvarT (Uniform a b) = enumUniform a b -+instance CDF Uniform Char where cdf (Uniform a b) = enumUniformCDF a b -+instance Distribution Uniform Bool where rvarT (Uniform a b) = enumUniform a b -+instance CDF Uniform Bool where cdf (Uniform a b) = enumUniformCDF a b -+instance Distribution Uniform Ordering where rvarT (Uniform a b) = enumUniform a b -+instance CDF Uniform Ordering where cdf (Uniform a b) = enumUniformCDF a b - - instance Distribution StdUniform () where rvarT ~StdUniform = return () - instance CDF StdUniform () where cdf ~StdUniform = return 1 -diff --git a/random-fu/src/Data/Random/Internal/TH.hs b/random-fu/src/Data/Random/Internal/TH.hs -deleted file mode 100644 -index 500b75b..0000000 ---- a/random-fu/src/Data/Random/Internal/TH.hs -+++ /dev/null -@@ -1,78 +0,0 @@ --{-# LANGUAGE -- TemplateHaskell -- #-} -- ---- |Template Haskell utility code to replicate instance declarations ---- to cover large numbers of types. I'm doing that rather than using ---- class contexts because most Distribution instances need to cover ---- multiple classes (such as Enum, Integral and Fractional) and that ---- can't be done easily because of overlap. ---- ---- I experimented a bit with a convoluted type-level classification ---- scheme, but I think this is simpler and easier to understand. It ---- makes the haddock docs more cluttered because of the combinatorial ---- explosion of instances, but overall I think it's just more sane than ---- anything else I've come up with yet. --module Data.Random.Internal.TH -- ( replicateInstances -- , integralTypes, realFloatTypes -- ) where -- --import Data.Generics --import Language.Haskell.TH -- --import Data.Word --import Data.Int --import Control.Monad -- ---- |Names of standard 'Integral' types --integralTypes :: [Name] --integralTypes = -- [ ''Integer -- , ''Int, ''Int8, ''Int16, ''Int32, ''Int64 -- , ''Word, ''Word8, ''Word16, ''Word32, ''Word64 -- ] -- ---- |Names of standard 'RealFloat' types --realFloatTypes :: [Name] --realFloatTypes = -- [ ''Float, ''Double ] -- ---- @replaceName x y@ is a function that will ---- replace @x@ with @y@ whenever it sees it. That is: ---- ---- > replaceName x y x ==> y ---- > replaceName x y z ==> z ---- (@z /= x@) --replaceName :: Name -> Name -> Name -> Name --replaceName x y z -- | x == z = y -- | otherwise = z -- ---- | @replicateInstances standin types decls@ will take the template-haskell ---- 'Dec's in @decls@ and substitute every instance of the 'Name' @standin@ with ---- each 'Name' in @types@, producing one copy of the 'Dec's in @decls@ for every ---- 'Name' in @types@. ---- ---- For example, 'Data.Random.Distribution.Uniform' has the following bit of TH code: ---- ---- @ $( replicateInstances ''Int integralTypes [d| @ ---- ---- @ instance Distribution Uniform Int where rvar (Uniform a b) = integralUniform a b @ ---- ---- @ instance CDF Uniform Int where cdf (Uniform a b) = integralUniformCDF a b @ ---- ---- @ |]) @ ---- ---- This code takes those 2 instance declarations and creates identical ones for ---- every type named in 'integralTypes'. --replicateInstances :: (Monad m, Data t) => Name -> [Name] -> m [t] -> m [t] --replicateInstances standin types getDecls = liftM concat $ sequence -- [ do -- decls <- getDecls -- sequence -- [ everywhereM (mkM (return . replaceName standin t)) dec -- | dec <- decls -- ] -- | t <- types -- ] --- -2.32.0 - - -From 2d38294582ba211df6a5a2b7f7a2c5e71038b0e7 Mon Sep 17 00:00:00 2001 -From: funketh <[email protected]> -Date: Fri, 7 May 2021 12:10:40 +0200 -Subject: [PATCH 3/3] remove redundant TemplateHaskell LANGUAGE pragmas - ---- - random-fu/src/Data/Random/Distribution/Bernoulli.hs | 3 +-- - random-fu/src/Data/Random/Distribution/Beta.hs | 3 +-- - random-fu/src/Data/Random/Distribution/Binomial.hs | 2 +- - random-fu/src/Data/Random/Distribution/Poisson.hs | 3 +-- - 4 files changed, 4 insertions(+), 7 deletions(-) - -diff --git a/random-fu/src/Data/Random/Distribution/Bernoulli.hs b/random-fu/src/Data/Random/Distribution/Bernoulli.hs -index c6a3c79..8d219e0 100644 ---- a/random-fu/src/Data/Random/Distribution/Bernoulli.hs -+++ b/random-fu/src/Data/Random/Distribution/Bernoulli.hs -@@ -1,8 +1,7 @@ - {-# LANGUAGE - MultiParamTypeClasses, - FlexibleInstances, FlexibleContexts, -- UndecidableInstances, -- TemplateHaskell -+ UndecidableInstances - #-} - - {-# OPTIONS_GHC -fno-warn-simplifiable-class-constraints #-} -diff --git a/random-fu/src/Data/Random/Distribution/Beta.hs b/random-fu/src/Data/Random/Distribution/Beta.hs -index e07b2c0..2e48258 100644 ---- a/random-fu/src/Data/Random/Distribution/Beta.hs -+++ b/random-fu/src/Data/Random/Distribution/Beta.hs -@@ -1,8 +1,7 @@ - {-# LANGUAGE - MultiParamTypeClasses, - FlexibleInstances, FlexibleContexts, -- UndecidableInstances, -- TemplateHaskell -+ UndecidableInstances - #-} - - {-# OPTIONS_GHC -fno-warn-simplifiable-class-constraints #-} -diff --git a/random-fu/src/Data/Random/Distribution/Binomial.hs b/random-fu/src/Data/Random/Distribution/Binomial.hs -index 8495a77..ff394b4 100644 ---- a/random-fu/src/Data/Random/Distribution/Binomial.hs -+++ b/random-fu/src/Data/Random/Distribution/Binomial.hs -@@ -1,7 +1,7 @@ - {-# LANGUAGE - MultiParamTypeClasses, - FlexibleInstances, FlexibleContexts, -- UndecidableInstances, TemplateHaskell, -+ UndecidableInstances, - BangPatterns - #-} - -diff --git a/random-fu/src/Data/Random/Distribution/Poisson.hs b/random-fu/src/Data/Random/Distribution/Poisson.hs -index 2613f49..a7c2cb4 100644 ---- a/random-fu/src/Data/Random/Distribution/Poisson.hs -+++ b/random-fu/src/Data/Random/Distribution/Poisson.hs -@@ -1,7 +1,6 @@ - {-# LANGUAGE - MultiParamTypeClasses, -- FlexibleInstances, FlexibleContexts, UndecidableInstances, -- TemplateHaskell -+ FlexibleInstances, FlexibleContexts, UndecidableInstances - #-} - - {-# OPTIONS_GHC -fno-warn-simplifiable-class-constraints #-} --- -2.32.0 -
