55 votes

Nourrissage de la soustraction

Si nous voulons carte une fonction qui augmente chaque élément d'une portée de 1, nous pouvons écrire

map (\x -> x + 1) [1..5]

mais je suppose que la plupart des gens il suffit d'aller pour

map (+1) [1..5]

au lieu de cela. Mais de toute évidence, cela ne fonctionne pas avec (-1) puisque c'est négatif.

Donc, la première chose qui vient à l'esprit

map (+(-1)) [1..5]

ce qui serait logique d'envisager comment la soustraction est défini dans le Prélude (x - y = x + negate y), mais semble un peu étrange pour moi. J'ai ensuite je suis venu avec

map (flip (-) 1) [1..5]

Cela semble quelque peu mieux pour moi, mais il est peut-être un peu trop compliqué.

Maintenant, je sais ce pas une grosse affaire, mais je me demande si je vais manquer un plus évident pour écrire cela? Si non, lequel de ces 2 façons préférez-vous? Je suis vraiment juste demander, car souvent c'est des petits détails comme ça qui font que votre code plus idiomatiques et donc agréable pour les autres développeurs qui doivent le lire.

Solution

Maintenant que j'ai eu quelques réponses, je pense que mon préféré est

map (subtract 1) [1..5]

suivie par

map pred [1..5]

principalement parce que le premier est vraiment explicite et personne n'a besoin de deviner/regarder jusqu'à ce qu' pred moyen (prédécesseur).

49voto

Anon. Points 26829

Vous pouvez utiliser l' subtract fonction au lieu de - si vous voulez de droit-section de la soustraction:

map (subtract 1) [1..5]

9voto

HaskellElephant Points 4985

Depuis - est à la fois l'infixe soustraire et le préfixe de nier, vous ne pouvez pas utiliser l' (*x) (où * est un opérateur infixe et x une valeur) de la syntaxe pour l' -. Heureusement, Prélude est livré avec negate et subtract, ce qui est \x -> -x et \x y -> y-x , respectivement, de sorte que vous pouvez utiliser ceux où vous avez besoin de différencier entre les deux.

2voto

dfeuer Points 1456

Je n'aime pas subtract parce que c'est de prêter à confusion à l'envers. Je vous suggère de

minus :: Num n => n -> n -> n
minus = (-)
infixl 6 `minus`

Ensuite, vous pouvez écrire

map (`minus` 1) [1..5]

2voto

carnieri Points 923

Je pense que map (\x -> x - 1) [1..5] transmet le programmeur de l'intention de la meilleure, car il n'y a pas de doute sur ce qui est soustrait de ce. Je trouve aussi votre première solution, map (+(-1)) [1..5], facile à lire, trop.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X