[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