J'ai lu Real World Haskell , et j'approche de la fin, mais une question de style me dérange à propos des opérateurs (.)
et ($)
.
Lorsque vous écrivez une fonction qui est une composition d'autres fonctions, vous l'écrivez 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 l'écrirait comme ceci:
k = a . b . c $ value
Maintenant, pour moi, ils semblent fonctionnellement équivalents, ils font exactement la même chose à mes yeux. Cependant, plus je regarde, plus je vois des gens écrire leurs fonctions à la manière du livre: composer avec d' (.)
abord puis seulement à la fin utiliser ($)
pour ajouter 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 qui est bien meilleure que d'utiliser tous les ($)
symboles? Ou y a-t-il des bonnes pratiques que je ne reçois pas? Ou est-ce superflu et je ne devrais pas m'inquiéter du tout?
la source
k = a $ b $ c value
a . b $ c value
, que je n'aime pas autant que le troisième exemple, mais enregistre quelques caractères.Réponses:
Je suppose que je peux répondre à cela par l'autorité.
Il n'y a pas de raison particulière. Bryan et moi préférons tous les deux réduire le bruit de ligne.
.
est plus silencieux que$
. En conséquence, le livre utilise laf . g . h $ x
syntaxe.la source
f.g.h
à une nouvelle création intelligentef(g(h()))
. Maintenant, ils appellent une nouvelle fonction, bien que anonyme, qu'ils ont créée plutôt que de simplement enchaîner un gros dictionnaire d'appels de fonctions préfabriqués comme un utilisateur PHP.Ils sont en effet équivalents: gardez à l'esprit que l'
$
opérateur ne fait essentiellement rien.f $ x
évalue àf x
. Le but de$
est son comportement de fixité: préséance associative à droite et minimale. En supprimant$
et en utilisant des parenthèses pour le regroupement au lieu de la priorité infixe, les extraits de code ressemblent à ceci:et
La raison de préférer la
.
version à la$
version est la même raison de préférer les deux à la version très entre parenthèses 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 une envie subconsciente d'éviter toute ressemblance possible avec Lisp (je plaisante ... je pense?).
la source
Je rajouterais que
f . g $ x
,f . g
est une unité syntaxique significative.Pendant ce temps, en
f $ g $ x
,f $ g
n'est pas une unité significative. Une chaîne de$
est sans doute plus impérative - obtenez d' abord le résultatg
dex
, puis faites-f
le, puis faites-foo
le, puis etc.Pendant ce temps, une chaîne de
.
est sans doute plus déclarative et, dans un certain sens, plus proche d'une vue centrée sur le flux de données - composez une série de fonctions et, finalement, appliquez-les à quelque chose.la source
$
opérateur semble se comporter de la même manière que l'<|
opérateur en F #. Je crois que les deux sont définis de la même manière, en fait - en F #(<|) a b = a b
et en Haskella $ b = a b
, qui sont essentiellement équivalents.(<|) b a = a b
en F #, car il est utilisé comme[1; 2; 3; 4; 5] <| List.map ((+) 1)
si la mémoire est bonne .<|
opérateur passe la valeur à la fonction, plutôt que de passer la fonction à la valeur - votre exemple de code fonctionnerait avec l'|>
opérateur à la place.Pour moi, je pense que la réponse est (a) la propreté, comme Don l'a dit ; et (b) je trouve que lorsque j'édite du code, ma fonction peut finir dans un style sans point, et alors tout ce que j'ai à faire est de supprimer le dernier
$
au lieu de revenir en arrière et de tout changer. Un point mineur, certes, mais une subtilité.la source
Il y a une discussion intéressante sur cette question sur ce fil de discussion haskell-cafe . Apparemment , il y a un point de vue minoritaire qui considère que le droit associativité
$
est « tout simplement faux » , et en choisissantf . g . h $ x
plusf $ g $ h $ x
est une façon de Esquive la question.la source
$!
a également la bonne associativité "tout à fait faux" - Pourquoi le $! opérateur droit-associatif? .C'est juste une question de style. Cependant, la façon dont le livre le fait a plus de sens pour moi. Il compose toutes les fonctions, puis l'applique à la valeur.
Votre méthode semble étrange et la dernière
$
est inutile.Cependant, cela n'a vraiment pas d'importance. Dans Haskell, il existe généralement de très nombreuses façons correctes de faire la même chose.
la source
Je sais que c'est une question très ancienne, 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 point
f . g . h
, la valeur que vous transmettez sera automatiquement appliquée. Cependant, si vous écrivezf $ g $ h
, cela ne fonctionnera pas.Je pense que la raison pour laquelle l'auteur préfère la méthode de composition est qu'elle conduit à une bonne pratique de création de fonctions.
la source