J'essaie, à partir d'une liste, de créer un arrangement aléatoire de ces éléments dans Haskell. J'ai déjà essayé l'algorithme en Javascript et cela a fonctionné. Je suis assez nouveau pour Haskell, donc je ne vois peut-être pas quelque chose. Je suis à peu près sûr que je reçois des éléments simples au lieu de listes avec juste un élément, ce qui fait planter mon programme. J'ai rencontré ce problème dans les exercices précédents mais je ne sais toujours pas comment le résoudre.Randomiser une liste dans Haskell
L'algorithme divise la liste jusqu'à obtenir un élément. Il y a 50% de chances de fusionner la liste telle qu'elle était et 50% de la fusionner dans l'autre sens.
Voici le code:
-- A randomly chosen, program-scoped constant from the range [1 .. 10]
randomInt :: Int
randomInt = unsafePerformIO (getStdRandom (randomR (1, 10)))
-- Divides the list in half
divideList :: [a] -> ([a], [a])
divideList list = splitAt ((length list) `div` 2) list
-- Given a list, it creates a new one with the elements of said list
randomizeList :: Eq a => a -> [a]
randomizeList list = do
let lists = (divideList list) in
if (length list) > 1
then if (randomInt > 5)
then (randomizeList (fst lists) : randomizeList (snd lists))
else (randomizeList (snd lists) : randomizeList (fst lists))
else [list]
Voici le code Javascript dans le cas où il aide:
function divideList(list){
const length = list.length/2;
return {fst: list.splice(0, length), snd: list};
}
function randomizeList(list) {
if(list.length == 1) return list;
const lists = divideList(list);
if(Math.random() > 0.5) return randomizeList(lists.fst).concat(randomizeList(lists.snd));
else return randomizeList(lists.snd).concat(randomizeList(lists.fst));
}
Merci à l'avance
Vous tapez la signature est incorrect 'randomizeList :: équation a => a -> [a ] 'prend un seul élément et renvoie une liste, vous vouliez probablement' [a] -> [a] '. Je ne vois pas non plus pourquoi 'Eq' est nécessaire – puhlen