divise :: [a] -> ([a], [a])
divise [ ] = ([ ], [ ]) -- cas d'une liste vide
divise [x] = ([x], [ ]) -- cas d'une liste avec un seul élément
divise (x:y:zs) = let (xs, ys) = divise zs in (x:xs, y:ys)
Explications :
La fonction divise prend en entrée une liste d'éléments de type quelconque (a) et retourne un couple de deux listes contenant les éléments de la liste d'entrée, divisée en deux.
Dans cette approche, on utilise la notation des motifs pour extraire les deux premiers éléments de la liste (x et y) et le reste de la liste (zs). On divise ensuite la liste zs en deux sous-listes en appelant récursivement la fonction divise, et on concatène les éléments x et y avec les sous-listes obtenues pour former les deux listes du résultat.
Les deux premiers cas traitent les situations où la liste d'entrée est vide ou contient un seul élément, respectivement. Dans ces cas, la liste est divisée en deux sous-listes vides et une sous-liste contenant l'unique élément, respectivement.
Ainsi, la fonction divise retourne le couple de deux listes contenant les éléments de la liste d'entrée, divisée en deux.
Notez que cette approche ne nécessite pas l'utilisation de la fonction splitAt, mais elle peut être moins performante pour les grandes listes, car elle doit parcourir la liste plusieurs fois pour extraire les sous-listes.