2016-03-24 1 views
2

J'ai donc trouvé cette définition de fonction qui prend une liste (xs) et la divise en trois parties en sortie.Haskell - Utilisation de Take et Drop pour diviser une liste en trois parties

Le truc, c'est que j'ai de la difficulté à le comprendre. Je comprends la première partie qui prend n de la liste (xs) où n est défini comme divisant la longueur de la liste (xs) par 3. Mais après cela, je ne suis pas sûr de ce qui se passe.

Si quelqu'un pouvait me guider à travers cette fonction ce serait génial.

Voici le code:

--SPLITS A LIST INTO THREE PARTS--------------------------------------------------------- 

split3 xs = (take n xs , take n (drop n xs) , drop (n*2) xs) 
    where n = length xs `div` 3 

Répondre

5

La deuxième partie laisse tomber les premiers éléments n et prend les n éléments suivants.

[------- n -------][------- n -------][------- n -------] 
^    ^
dropped   taken by `take` ^dropped by `take` 

Un exemple concret pourrait être une liste de [1,2,3], n == 1.

take n (drop n xs) 
== take 1 (drop 1 [1,2,3]) 
== take 1 [2,3] 
== 2 

La troisième partie gouttes deux fois n et prend le reste

[----    2n   -----][---- n -----] 
^         ^
dropped        taken by `drop` 
+0

Je suis désolé, je ne comprends toujours pas, dans votre exemple de vous [1,2,3] drop 1 dans la liste d'abord, puis 1 dans cette liste. Je ne comprends pas comment cela fonctionne. Est-ce que vous voulez dire littéralement prendre l'élément numéro 1 de la liste ou un élément de la liste? Aussi sur la ligne == prendre 1 [2,3] pourquoi le résultat est juste 2? –

+0

Aussi, pourrais-je avoir une explication plus détaillée sur cette phrase "La seconde partie laisse tomber les n premiers éléments et prend les n éléments suivants." Cela me déroute vraiment. –

+0

@ GR412 'take 1' est une fonction qui prend un élément de l'avant, pas l'élément' 1'! Considérons 'take 2 ['a', 'b', 'c] == [' a ',' b ']'. Ainsi, la phrase signifie simplement que le «take» dans ce cas est appelé sur une liste que vous obtenez lorsque vous prenez la liste originale et que vous en perdez les premiers éléments. Cependant, la "queue" restante a 2n éléments, le deuxième 1/3 et le troisième 1/3, donc en prenant seulement n vous obtenez la partie moyenne réelle. –