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

Sergiu Ivanov sivanov at colimite.fr
Fri Aug 3 12:54:03 UTC 2018


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: 487 bytes
Desc: not available
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180803/683d7431/attachment.sig>


More information about the Haskell-Cafe mailing list