[Haskellcafe] [randomfu] sampleRVar with StdGen in RWS?
Sergiu Ivanov
sivanov at colimite.fr
Fri Aug 3 13:53:05 UTC 2018
Thus quoth Vanessa McHale on Fri Aug 03 2018 at 15:06 (+0200):
> It seems like the instance comes from
> http://hackage.haskell.org/package/randomsource0.3.0.6/docs/DataRandomInternalSource.html#v:getRandomPrim
> then, no? I only see an instance for `StateT` unfortunately.
Yes, that's what I see as well.
> I suppose you could write an orphan instance for RWST if you really
> wanted to.
That's what I'll most probably do for my small project, but I was
wondering whether it made sense to make a pull request to randomfu. To
me, having a MonadRandom for both StateT and RWST seems very natural.

Sergiu
> 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 randomfu 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 writestate:
>>
>> 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 writestate 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/MonadRandom0.5.1.1/docs/ControlMonadRandomClass.html#t:MonadRandom
>>>
>>>
>>> On 08/03/2018 07:31 AM, Sergiu Ivanov wrote:
>>>> Dear Café,
>>>>
>>>> I would like to use randomfu to do some pseudorandom 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/randomsource0.3.0.6/docs/DataRandomSource.html
>>>>
>>>>
>>>> _______________________________________________
>>>> HaskellCafe mailing list
>>>> To (un)subscribe, modify options or view archives go to:
>>>> http://mail.haskell.org/cgibin/mailman/listinfo/haskellcafe
>>>> Only members subscribed via the mailman list are allowed to post.
 next part 
A nontext attachment was scrubbed...
Name: signature.asc
Type: application/pgpsignature
Size: 487 bytes
Desc: not available
URL: <http://mail.haskell.org/pipermail/haskellcafe/attachments/20180803/fd318ebf/attachment.sig>
More information about the HaskellCafe
mailing list