2010-03-30 3 views

Répondre

39
pairs [] = [] 
pairs xs = zip xs (tail xs) 
+21

Vous devriez être ok avec juste la deuxième ligne depuis 'zip [] undefined' est' [] ' – rampion

+0

Oh, vous avez raison. Je n'y ai pas pensé. –

+0

@rampion: Vous avez vraiment besoin de savoir comment le zip fonctionne en interne afin de savoir que c'est le cas et cela signifierait que zip (tail xs) xs ne fonctionnerait pas. Cela ne semble pas être un bon moyen d'écrire du code clair et évident. –

6

Juste pour être complet, une version plus "bas niveau" à l'aide récursion explicite:

pairs (x:[email protected](y:_)) = (x, y) : pairs xs 
pairs _   = [] 

La construction x:[email protected](y:_) signifie " une liste avec une tête x, et une queue xs qui a au moins un élément y ". C'est parce que y double à la fois le second élément de la paire actuelle et le premier élément de la suivante. Sinon, nous aurions dû faire un cas particulier pour les listes de longueur 1.

pairs [_] = [] 
pairs [] = [] 
pairs (x:xs) = (x, head xs) : pairs xs 
+4

'paires (x: y: reste) = (x, y) : paires (y: reste) 'fonctionnerait aussi, évitant le besoin de' @ ', bien que cela soit au prix d'un constructeur supplémentaire. – ephemient

20

Vous pouvez aller aussi loin que

import Control.Applicative (<*>) 
pairs = zip <*> tail 

mais

pairs xs = zip xs (tail xs) 

est probablement plus clair.

+1

Super! Je suis un débutant, donc il m'a fallu environ 30 minutes pour comprendre pourquoi 'zip <*> tail' fonctionne, mais il en valait vraiment la peine. Si quelqu'un d'autre est aussi curieux, jetez un oeil ici: http://stackoverflow.com/questions/11810889/functions-as-applicative-functors-haskell-lyah et, dans le processus, lisez le chapitre 11 de LYAH. Belle citation: _ "Une autre instance de Applicative est (->) r, donc des fonctions.Ils sont rarement utilisés avec le style applicatif en dehors du code golf [...]" _ – Bolo

+0

Selon pointfree.io, 'paires = ap zip tail' fonctionne également, comme 'ap' est comme' <*> 'mais pour les monades. – Caridorc

2

Appel au dieu aztèque de numéros consécutifs:

import Control.Monad (ap) 
import Control.Monad.Instances() -- for Monad ((->) a) 

foo = zip`ap`tail $ [1,2,3,4] 
Questions connexes