
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
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
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@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners