La forma más sencilla es utilizar el módulo de System.Random
, está en el paquete al azar, por lo que probablemente tenga que instalar primero.
Este módulo define a las clases de tipos:
class RandomGen g where
next :: g -> (Int,g)
-- ...
class Random r where
random :: RandomGen g => g -> (a,g)
randomR :: RandomGen g => (r,r) -> g -> (a, g)
La clase de tipos, hay que aplicar es al azar, específica la primera función (como el segundo no tiene sentido, sólo se puede aplicar como randomR = const random
¿Qué random
.? se obtiene un generador aleatorio como entrada, tiene que generar lo que necesita para ello, y dar al nuevo generador
para generar los valores aleatorios, se podría utilizar la mónada State
, o algo como esto:.
random g = (myResult,gn) where
(random1,g1) = next g
(random2,g2) = next g2
-- ...
continuación, puede utilizar los sistemas de generador aleatorio por esta función:
randomIO :: Random r => IO r
Se está predefinido y se obtiene un valor diferente cada llamada.
Sin embargo, finalmente tiene que decidir cómo definir su instancia aleatoria.
Gracias por la respuesta ultrarrápida, pero ¿qué quiere decir con <$>? – SirLenz0rlot
Ah, es de 'Control.Applicative', solo una sintaxis simplificada que significa que puede aplicar una función a un valor aleatorio. – Dario
Es simplemente 'fmap' – fuz