Haskell list monad

Bonjour,
j’ai un petit problème avec une fonction en Haskell qui construit des mobiles à partir d’une liste de nombres.
Lorsque je construit ces mobiles à partir d’une liste normale ([a]) pas de soucis, mais je veux faire une variante de
cette fonction qui mélange alétoirement cette liste. Cependant, après l’avoir modifié en faisant intervenir l’aléatoire,
je me retrouve avec une liste de type IO [a].
On m’a donc dit qu’il fallait que je reste dans Monad et que je ne pouvait plus revenir dans Haskell sans monad.
Mais le soucis c’est que j’ai du mal avec cette histoire de monad.
Voilà ce que j’ai commencé :

import System.Random
--je vous met juste les types des différentes fonctions qui sont utilisées

data Mobile = Poids Rational | Branche Rational Mobile Mobile deriving Show

poids :: Mobile -> Rational --calcule le poids d'un mobile
splity :: [a] -> ([a],[a]) --Fonction qui découpe une liste en 2

ranCreation (x:xs) =
do if xs == []
then return (Poids x) --si la liste ne contient qu'un seul élément, elle retourne (Poids x)
else let m = splity li -- sinon on (re)découpe la liste
x <- shuffle (fst m) -- et on construit récursivement 2 mobiles
y <- shuffle (snd m)
let k = ((poids y)/(poids x+poids y))
return (Branche k (ranCreation x) (ranCreation)) --que l'on met bout à bout à la fin

Voilà en espérant être à peu près clair.
Si quelqu’un peut m’aider.
Merci.

Alors j’ai pas tout bien saisi mais tu parle bien de ces monades (en.wikipedia.org/wiki/Monads_in_ … rogramming)

Ouai voilà monade IO.
Je veux mélanger aléatoirement une liste, et ensuite créer un mobile mais le problème c’est que après le mélange je me retrouve avec une liste de type IO [a]. Donc je ne peux pas réutiliser mes fonctions définies auparavant pour créer un mobile, je dois rester dans la monade.
Voilà.
Merci.