Composition de la fonction Haskell (.) Et idiomes de l’application de fonction ($): utilisation correcte

J’ai lu Real World Haskell , et je suis sur le sharepoint finir, mais une question de style me dérange avec les opérateurs (.) Et ($) .

Lorsque vous écrivez une fonction qui est une composition d’autres fonctions, vous l’écrivez comme suit:

 f = g . h 

Mais quand vous appliquez quelque chose à la fin de ces fonctions, je l’écris comme ceci:

 k = a $ b $ c $ value 

Mais le livre l’écrirait comme ceci:

 k = a . b . c $ value 

Maintenant, pour moi, ils sont fonctionnellement équivalents, ils font exactement la même chose à mes yeux. Cependant, plus je regarde, plus je vois les gens écrire leurs fonctions de la même manière que le livre: composez avec (.) abord, puis seulement à la fin ($) pour append une valeur pour évaluer le lot (personne ne le fait) avec beaucoup de compositions en dollars).

Y a-t-il une raison d’utiliser la méthode des livres bien mieux que d’utiliser tous les symboles ($) ? Ou y a-t-il une pratique exemplaire que je ne reçois pas? Ou est-ce superflu et je ne devrais pas m’en préoccuper du tout?

Je suppose que je peux répondre à cela par l’autorité.

Y a-t-il une raison d’utiliser la méthode des livres bien mieux que d’utiliser tous les symboles ($)?

Il n’y a pas de raison particulière. Bryan et moi préférons tous deux réduire le bruit de ligne. . est plus silencieux que $ . En conséquence, le livre utilise le f . g . h $ x f . g . h $ x f . g . h $ x syntaxe.

Ils sont en effet équivalents: Gardez à l’esprit que l’opérateur $ ne fait essentiellement rien. f $ x évalué à fx . Le but de $ est son comportement de fixité: associatif de droite et préséance minimale. En supprimant $ et en utilisant des parenthèses pour le regroupement au lieu de la priorité infixe, les extraits de code ressemblent à ceci:

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

et

 k = (a . b . c) value 

La raison de préférer le . la version sur la version $ est la même raison pour préférer les deux à la version très parenthèse ci-dessus: l’attrait esthétique.

Cependant, certains pourraient se demander si l’utilisation d’opérateurs infixes au lieu de parenthèses est basée sur un besoin inconscient d’éviter toute ressemblance possible avec Lisp (je plaisante? Je pense?).

J’appendais ça dans f . g $ x f . g $ x , f . g f . g est une unité syntaxique significative.

Pendant ce temps, dans f $ g $ x , f $ g n’est pas une unité significative. Une chaîne de $ est sans doute plus impérative – commencez par obtenir le résultat de g de x , puis faites-le, puis faites-le, puis etc.

En attendant une chaîne de . est sans doute plus déclaratif et, dans un certain sens, plus proche d’une vue centrée sur les stream de données – compose une série de fonctions et les applique finalement à quelque chose.

Pour moi, je pense que la réponse est (a) la netteté, comme l’a dit Don ; et (b) je trouve que lorsque je modifie du code, ma fonction peut aboutir à un style sans point, et tout ce que j’ai à faire est de supprimer le dernier $ au lieu de tout changer. Un petit point, certes, mais une finesse.

Il y a une discussion intéressante sur cette question sur ce fil de haskell-café . Apparemment, il existe un sharepoint vue minoritaire selon lequel la bonne associativité de $ est “tout simplement fausse” , et en choisissant f . g . h $ x f . g . h $ x f . g . h $ x sur f $ g $ h $ x est une façon de contourner le problème.

C’est juste une question de style. Cependant, la manière dont le livre est écrit a plus de sens pour moi. Il compose toutes les fonctions et l’applique ensuite à la valeur.

Votre méthode a juste l’air étrange, et le dernier $ n’est pas nécessaire.

Cependant, cela n’a vraiment pas d’importance. Dans Haskell, il existe généralement de nombreuses façons de faire la même chose.

Je me rends compte que c’est une très vieille question, mais je pense qu’il y a une autre raison à cela qui n’a pas été mentionnée.

Si vous déclarez une nouvelle fonction sans points f . g . h f . g . h f . g . h , la valeur que vous passez sera automatiquement appliquée. Cependant, si vous écrivez f $ g $ h , cela ne fonctionnera pas.

Je pense que la raison pour laquelle l’auteur préfère la méthode de composition est que cela conduit à une bonne pratique de la création de fonctions.