La fonction paires a besoin de faire quelque chose comme ceci:Comment écrivez-vous la fonction 'paires' dans Haskell?
pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
La fonction paires a besoin de faire quelque chose comme ceci:Comment écrivez-vous la fonction 'paires' dans Haskell?
pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
pairs [] = []
pairs xs = zip xs (tail xs)
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
'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
Vous pouvez aller aussi loin que
import Control.Applicative (<*>)
pairs = zip <*> tail
mais
pairs xs = zip xs (tail xs)
est probablement plus clair.
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
Selon pointfree.io, 'paires = ap zip tail' fonctionne également, comme 'ap' est comme' <*> 'mais pour les monades. – Caridorc
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]
Vous devriez être ok avec juste la deuxième ligne depuis 'zip [] undefined' est' [] ' – rampion
Oh, vous avez raison. Je n'y ai pas pensé. –
@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. –