[Haskell-cafe] [random-fu] sampleRVar with StdGen in RWS?

Vanessa McHale vanessa.mchale at iohk.io
Fri Aug 3 13:06:20 UTC 2018


It seems like the instance comes from
http://hackage.haskell.org/package/random-source-0.3.0.6/docs/Data-Random-Internal-Source.html#v:getRandomPrim
then, no? I only see an instance for `StateT` unfortunately. I suppose
you could write an orphan instance for RWST if you really wanted to.


On 08/03/2018 07:54 AM, Sergiu Ivanov wrote:
> Hello Vanessa,
>
> MonadRandom from Control.Monad.Random does indeed have an RWST instance,
> but I'd like to stick with random-fu because of the long list of
> provided distributions, and the two seem incompatible :
>
>   https://stackoverflow.com/a/13946470
>
> I did try to force a very monoidal write-state:
>
>   testRWS :: StdGen -> Int
>   testRWS = fst . evalRWS work ()
>     where
>       work = do
>         tell "hello"
>         sampleRVar $ uniform 1 10
>
> I get
>
>   <interactive>:2:25: error:
>   • No instance for (MonadRandom (RWST () String StdGen Identity)) arising from a use of ‘work’
>   • In the first argument of ‘evalRWS’, namely ‘work’
>   In the second argument of ‘(.)’, namely ‘evalRWS work ()’
>   In the expression: fst . evalRWS work ()
>
> which seems to be saying the same thing as before :-(
>
> -
> Sergiu
>
>
> Thus quoth  Vanessa McHale  on Fri Aug 03 2018 at 14:43 (+0200):
>> It seems like you need your write-state to be a monoid in order to infer
>> a `MonadRandom` instance. Based on your code, I'm guessing the compiler
>> can't infer that.
>>
>> Have a look at
>> https://hackage.haskell.org/package/MonadRandom-0.5.1.1/docs/Control-Monad-Random-Class.html#t:MonadRandom
>>
>>
>> On 08/03/2018 07:31 AM, Sergiu Ivanov wrote:
>>> Dear Café,
>>>
>>> I would like to use random-fu to do some pseudo-random simulations for a
>>> given StdGen (so that I can run the same simulation multiple times, if
>>> needed).
>>>
>>> The following works:
>>>
>>>   testState :: StdGen -> Int
>>>   testState = evalState (sampleRVar $ uniform 1 10)
>>>
>>> The following doesn't:
>>>
>>>   testRWS :: StdGen -> Int
>>>   testRWS = fst . evalRWS (sampleRVar $ uniform 1 10) ()
>>>
>>> I get
>>>
>>>   <interactive>:2:26: error:
>>>   • No instance for (MonadRandom (RWST () b0 StdGen Identity)) arising from a use of ‘sampleRVar’
>>>   • In the first argument of ‘evalRWS’, namely ‘(sampleRVar $ uniform 1 10)’
>>>   In the second argument of ‘(.)’, namely ‘evalRWS (sampleRVar $ uniform 1 10) ()’
>>>   In the expression: fst . evalRWS (sampleRVar $ uniform 1 10) ()
>>>
>>> Indeed, I do see a MonadRandom instance for StateT, but none for RWST [0].
>>>
>>> Is there a reason to not have a MonadRandom instance for RWST?
>>>
>>> Am I looking in the wrong place?
>>>
>>> -
>>> Sergiu
>>>
>>> [0] https://hackage.haskell.org/package/random-source-0.3.0.6/docs/Data-Random-Source.html
>>>
>>>
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> To (un)subscribe, modify options or view archives go to:
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>>> Only members subscribed via the mailman list are allowed to post.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180803/900b3c45/attachment.sig>


More information about the Haskell-Cafe mailing list