Declare que todas as instâncias de uma classe estão em outra classe sem modificar as declarações de classe originais
Existe uma API Crypto.Random dentro do pacote crypto-api que especifica o que significa algo ser um "gerador de números pseudo-aleatórios"
Implementei essa API usando uma instância da classe RandomGen do System.Random, a saber, StdGen:
instance CryptoRandomGen StdGen where
newGen bs = Right $ mkStdGen $ shift e1 24 + shift e2 16 + shift e3 8 + e4
where (e1 : e2 : e3 : e4 : _) = Prelude.map fromIntegral $ unpack bs
genSeedLength = Tagged 4
genBytes n g = Right $ genBytesHelper n empty g
where genBytesHelper 0 partial gen = (partial, gen)
genBytesHelper n partial gen = genBytesHelper (n-1) (partial `snoc` nextitem) newgen
where (nextitem, newgen) = randomR (0, 255) gen
reseed bs _ = newGen bs
No entanto, essa implementação é apenas para o tipo StdGen, mas realmente funcionaria para qualquer coisa na classe RandomGen do System.Rando
Existe uma maneira de dizer que tudo no RandomGen é um membro do CryptoRandomGen usando as funções de shim fornecidas? Eu gostaria de poder fazer isso no meu próprio código, sem precisar alterar a fonte de nenhuma dessas duas bibliotecas. Meus instintos seriam mudar a primeira linha para algo como
instance (RandomGen a) => CryptoRandomGen a where
mas isso não parece estar sintaticamente corret