125 votes

Idiomes de composition de fonction Haskell (.) Et d'application de fonction ($): utilisation correcte

J'ai lu Real World Haskell et je suis presque à la fin, mais une question de style a été tatillonne à moi de faire avec les (.) et ($) des opérateurs.

Lorsque vous écrivez une fonction qui est une composition de fonctions autres que vous l'écrire comme:

f = g . h

Mais lorsque vous appliquez quelque chose à la fin de ces fonctions je l'écris comme ceci:

k = a $ b $ c $ value

Mais le livre de l'écrire comme ceci:

k = a . b . c $ value

Maintenant, pour moi, ils regardent fonctionnellement équivalent, ils font exactement la même chose à mes yeux. Cependant, plus je regarde, plus je vois des gens qui écrivent leurs fonctions, de la manière que le livre n': composer avec (.) d'abord et ensuite seulement à l'utilisation finale (en$) pour ajouter une valeur à évaluer le lot (personne ne le fait avec beaucoup de dollar des compositions). Est-il une raison pour utiliser les livres manière qui est beaucoup mieux que d'utiliser tous ($) des symboles? Ou est-il une meilleure pratique ici que je ne suis pas arriver? Ou est-ce superflu et que je ne devrais pas m'en préoccuper? Merci.

149voto

Don Stewart Points 94361

Je suppose que je peux répondre à cette autorité.

Y a-t-il une raison pour utiliser le moyen de livres qui est beaucoup mieux que d’utiliser tous les symboles ($) ?

Il n’y a aucune raison spéciale. Bryan et je préfère réduire le bruit de la ligne. est plus silencieux que

En conséquence, le livre utilise la `` syntaxe

53voto

C. A. McCann Points 56834

Ils sont en effet équivalentes: Gardez à l'esprit que l' $ opérateur n'a, pour l'essentiel, rien. f $ x évalue f x. Le but de l' $ est sa fixité comportement: droit associatif et un minimum de priorité. Retrait d' $ et en utilisant des parenthèses pour regrouper au lieu de infix priorité, les extraits de code ressemble à ceci:

k = a (b (c (value)))

et

k = (a . b . c) value

La raison pour préférer l' . version par rapport à l' $ version est la même raison pour préférer à la fois sur la très parenthèses version ci-dessus: l'esthétique.

Bien que, certains pourraient se demander si l'aide des opérateurs infixes au lieu de parenthèses est basé sur certains subconscient envie d'éviter toute ressemblance avec des Lisp (juste une blague... je pense?).

38voto

sclv Points 25335

J'ajouterais que, en f . g $ x, f . g est un véritable unité syntaxique. Pendant ce temps, en f $ g $ x, f $ g n'est pas une unité appropriée. une chaîne d' $ est sans doute plus impératif - d'abord obtenir le résultat de g de x, alors ne f, puis faire foo, puis etc. Entre-temps, une chaîne de . est sans doute plus déclaratif, et dans un certain sens plus proche d'un flux de données de vue centré -- composer une série de fonctions, et, finalement, de les appliquer à quelque chose.

18voto

Antal S-Z Points 17977

Pour moi, je pense que la réponse est (a) la propreté, comme dit Don; et (b) je trouve que lorsque je suis modification de code, ma fonction peut-être finir dans le style sans point et puis tout ce que je dois faire est supprimer la dernière `` au lieu de revenir en arrière et changer tout. Un point mineur, certes, mais une subtilité.

13voto

Travis Brown Points 56342

Il y a une discussion intéressante de cette question sur ce fil de haskell-café. Apparemment, il y a un point de vue minoritaire qui soutient que l’associativité de droite de est [« tout simplement faux »](http://www.mail-archive.com/haskell-cafe@haskell.org/msg12549.html)et en choisissant sur `` est une façon d’esquiver la question.

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