[arch-commits] Commit in haskell-random-fu/repos (3 files)

Felix Yan felixonmars at archlinux.org
Sat Jun 19 19:40:37 UTC 2021


    Date: Saturday, June 19, 2021 @ 19:40:37
  Author: felixonmars
Revision: 965635

archrelease: copy trunk to community-staging-x86_64

Added:
  haskell-random-fu/repos/community-staging-x86_64/
  haskell-random-fu/repos/community-staging-x86_64/PKGBUILD
    (from rev 965634, haskell-random-fu/trunk/PKGBUILD)
  haskell-random-fu/repos/community-staging-x86_64/ghc9.patch
    (from rev 965634, haskell-random-fu/trunk/ghc9.patch)

------------+
 PKGBUILD   |   46 +
 ghc9.patch | 1744 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1790 insertions(+)

Copied: haskell-random-fu/repos/community-staging-x86_64/PKGBUILD (from rev 965634, haskell-random-fu/trunk/PKGBUILD)
===================================================================
--- community-staging-x86_64/PKGBUILD	                        (rev 0)
+++ community-staging-x86_64/PKGBUILD	2021-06-19 19:40:37 UTC (rev 965635)
@@ -0,0 +1,46 @@
+# Maintainer: Felix Yan <felixonmars at archlinux.org>
+
+_hkgname=random-fu
+pkgname=haskell-random-fu
+pkgver=0.2.7.7
+pkgrel=73
+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')
+makedepends=('ghc')
+source=("https://hackage.haskell.org/packages/archive/$_hkgname/$pkgver/$_hkgname-$pkgver.tar.gz"
+        ghc9.patch)
+sha256sums=('8466bcfb5290bdc30a571c91e1eb526c419ea9773bc118996778b516cfc665ca'
+            'b96a87ecadea4d1897b3250b43445d22a56fef90ae12645d573e6c92456e921f')
+
+prepare() {
+  patch -d $_hkgname-$pkgver -p2 < ghc9.patch
+}
+
+build() {
+  cd $_hkgname-$pkgver
+
+  runhaskell Setup configure -O --enable-shared --enable-executable-dynamic --disable-library-vanilla \
+    --prefix=/usr --docdir=/usr/share/doc/$pkgname --enable-tests \
+    --dynlibdir=/usr/lib --libsubdir=\$compiler/site-local/\$pkgid \
+    --ghc-option=-optl-Wl\,-z\,relro\,-z\,now \
+    --ghc-option='-pie'
+
+  runhaskell Setup build $MAKEFLAGS
+  runhaskell Setup register --gen-script
+  runhaskell Setup unregister --gen-script
+  sed -i -r -e "s|ghc-pkg.*update[^ ]* |&'--force' |" register.sh
+  sed -i -r -e "s|ghc-pkg.*unregister[^ ]* |&'--force' |" unregister.sh
+}
+
+package() {
+  cd $_hkgname-$pkgver
+
+  install -D -m744 register.sh "$pkgdir"/usr/share/haskell/register/$pkgname.sh
+  install -D -m744 unregister.sh "$pkgdir"/usr/share/haskell/unregister/$pkgname.sh
+  runhaskell Setup copy --destdir="$pkgdir"
+}

Copied: haskell-random-fu/repos/community-staging-x86_64/ghc9.patch (from rev 965634, haskell-random-fu/trunk/ghc9.patch)
===================================================================
--- community-staging-x86_64/ghc9.patch	                        (rev 0)
+++ community-staging-x86_64/ghc9.patch	2021-06-19 19:40:37 UTC (rev 965635)
@@ -0,0 +1,1744 @@
+From 268e66b778157e64f508d9d2018f8252034cc14d Mon Sep 17 00:00:00 2001
+From: Alexey Kuleshevich <alexey at kuleshevi.ch>
+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 at .
+--- 
++--
+ -- 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 at .
+--- 
++--
+ -- 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 <theodor.k.funke at gmail.com>
+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 at .
+---
+--- 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 <theodor.k.funke at gmail.com>
+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
+



More information about the arch-commits mailing list