[Haskell-beginners] crypto random UUID generation

Ovidiu Deac ovidiudeac at gmail.com
Tue Dec 13 11:41:45 UTC 2016


Thanks! It works.

Why is this a "quick and dirty" fix and what would be the "clean" fix?

On Mon, Dec 12, 2016 at 8:15 PM, David McBride <toad3k at gmail.com> wrote:

> The problem is with
>   Left err -> throwIO err
>
> Because of the type of 'runCRand', we know err is an instance of
> ContainsGenError e0, but which one?  We need a concrete error type before
> we can run this code.  Looking at the docs there seems to be only one
> instance of ContainsGenError, GenError, so a quick an dirty solution would
> be to change it to
>
>   Left err -> throwIO (err :: GenError) -- should work
>
> But keep in mind, if there were any other ContainsGenError instances, like
> from an external library that is adding a new type of random generator to
> this library that fails in a new way, you would not be catching that.
>
>
> On Mon, Dec 12, 2016 at 12:52 PM, Ovidiu Deac <ovidiudeac at gmail.com>
> wrote:
>
>> I have to produce a crypto random UUID.
>>
>> I haven't found simple examples. and I used the one from hre (see type
>> CRand) http://hackage.haskell.org/package/monadcryptorandom-0.7.0/
>> docs/Control-Monad-CryptoRandom.html#v:getCRandomR
>>
>> My attempt is the following:
>>
>> cryptoRandomUUID :: IO UUID.UUID
>> cryptoRandomUUID = do
>>   g <- newGenIO:: IO SystemRandom
>>   case runCRand impl g of
>>     Left err -> throwIO err
>>     Right (v, g') -> return v
>>
>>   where impl = do
>>           w1 <- getCRandom
>>           w2 <- getCRandom
>>           w3 <- getCRandom
>>           w4 <- getCRandom
>>           return $ UUID.fromWords w1 w2 w3 w4
>>
>> ...but the compilation fails miserably with:
>>
>>     • Ambiguous type variable ‘e0’ arising from a use of ‘runCRand’
>>       prevents the constraint ‘(ContainsGenError e0)’ from being solved.
>>       Relevant bindings include
>>         impl :: CRandT
>>                   SystemRandom e0 Data.Functor.Identity.Identity UUID.UUID
>>           (bound at src/Party.hs:75:9)
>>       Probable fix: use a type annotation to specify what ‘e0’ should be.
>>       These potential instance exist:
>>         instance ContainsGenError GenError
>>           -- Defined in ‘Control.Monad.CryptoRandom’
>>     • In the expression: runCRand impl g
>>       In a stmt of a 'do' block:
>>         case runCRand impl g of {
>>           Left err -> throwIO err
>>           Right (v, g') -> return v }
>>       In the expression:
>>         do { g <- newGenIO :: IO SystemRandom;
>>              case runCRand impl g of {
>>                Left err -> throwIO err
>>                Right (v, g') -> return v } }
>>       ...
>>
>> What's the problem here?
>> Are there some good examples for generating crypto-randoms?
>>
>> Thanks!
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20161213/66d2a46a/attachment-0001.html>


More information about the Beginners mailing list