[Short Poem] Les appels de fonction Haskell / PureScript sont meilleurs que Ruby / Python / JavaScript

Appel Proc #

Par exemple, considérons les fonctions «add» et «sum» qui produisent la somme de deux arguments. Avec Python et JavaScript, vous pouvez écrire du code comme celui-ci:

python


def add(x, y):
    print(x + y)
 
sum = add    #Peut être remplacé tel quel
 
add(1, 2) 
sum(1, 2)    #Il n'y a aucune différence dans la façon d'appeler add et sum

JavaScript


function add(x, y){
    console.log(x + y);
}

sum = add    //Peut être remplacé tel quel

add(1, 2) 
sum(1, 2)    //Il n'y a aucune différence dans la façon d'appeler add et sum

Cependant, dans Ruby, il n'est pas possible d'assigner une méthode à une autre variable telle quelle, vous devez créer un objet Proc avec proc ou lambda puis le transmettre, et le destinataire passe également l'appel. Vous devez l'appeler. C'est également le cas autour de Java où vous devez appeler la méthode ʻapply`.

Ruby


def add(x, y)
    puts (x + y)
end

sum = proc{|x, y| add(x, y)}  #Besoin d'envelopper dans proc ou lambda

add 1, 2          
sum.call 1, 2                 #Il est nécessaire d'appeler avec call, et l'utilisation de add et sum est différente.

Je vois, ce n'est pas bon. Cependant, il existe un contre-argument du côté Ruby, et Ruby a l'avantage que les parenthèses peuvent être omises dans les appels de méthode lorsqu'il n'y a pas d'arguments.

JavaScript


function answer(){
    console.log(42)
}

answer()        //Il y a des parenthèses

Ruby


def answer
    puts 42
end

answer            #Je n'ai pas besoin de parenthèses

Je le trouve aussi un peu maladroit et difficile à gérer. Mais, comme le dit le texte, il s'agit d'un compromis avec le style unique qui ajoute de la valeur à Ruby.

Tenter d'introduire de telles abréviations dans JavaScript ou Python n'est pas possible car cela entre en conflit avec la syntaxe qui représente l'objet fonction lui-même. C'est pourquoi, d'après ce que je peux voir, il ne semble pas que je puisse dire lequel est le meilleur ...

Dans Haskell / PureScript

Haskell / PureScript résout ce dilemme.

PureScript


add x y = logShow (x + y)    --add a un argument

sum = add                    --Les fonctions sont de première classe, vous pouvez donc les attribuer normalement

answer = logShow 42          --la réponse n'a pas d'arguments

fortyTwo = answer           --Puisque la valeur de réponse est également de première classe, vous pouvez l'affecter à une autre variable telle quelle.

main = do
    add 1 2                  --3 est émis. Bien sûr, vous pouvez l'appeler normalement s'il y a un argument
    sum 1 2                  --3 est émis. Il n'y a aucune différence dans la façon d'appeler add et sum
    answer                   --42 est émis. Bien sûr, il n'y a pas de parenthèses même s'il n'y a pas d'arguments
    fortyTwo                 --42 est émis. Parce que quarante-deux et réponse se réfèrent à la même chose.

Il y a deux avantages: "L'appel de fonction sans argument de Ruby peut omettre les parenthèses" et "l'appel de fonction normal et l'appel d'objet de fonction de Python / JavaScript ne sont pas distingués". Mystérieux! Il peut être intéressant de penser par vous-même pourquoi Haskell / PureScript peut faire cela, ce que signifie chaque partie du code ci-dessus, et dans quel ordre l'exécution se déroule [^ sample].

[^ sample]: Cependant, je ne pense pas que quiconque ne connaisse pas Haskell / PureScript le saura. Puisqu'il s'agit de code PureScript, la spécification de transformation unique de Haskell "évaluation du délai" qui perturbe l'ordre d'exécution n'est pas pertinente.

De plus, si vous regardez attentivement le code PureScript ci-dessus, il n'y a pas de points, pas de deux-points et même une virgule. Le seul mot réservé est «do», qui signale le début du bloc de code. Vous pouvez voir que le code a l'air étrangement rafraîchissant, comme le bloc représenté par une indentation comme Python. C'est également une fonctionnalité du code Haskell / PureScript. Le bruit syntaxique est réduit à la limite et je pense qu'il est très facile à lire, mais pour une raison quelconque, on dit parfois qu'il est difficile à lire.

C'est un problème de grammaire, alors peut-être qu'une langue avec une grammaire qui les équilibre sera développée à l'avenir.

Il existe depuis plus de 15 ans. Ce n'est pas très connu car il y a trop peu de personnes qui l'utilisent ...

De nombreux utilisateurs de Ruby peuvent ne pas aimer une telle surcharge syntaxique, comme essayer d'omettre les parenthèses lorsqu'il n'y a pas d'arguments. Haskell / PureScript a une syntaxe simple, donc je pense qu'elle convient aux personnes qui aiment Ruby. Je ne me soucie pas vraiment de ces détails, mais je pense généralement qu'il est pratique d'abstraire des actions synchrones et asynchrones avec des monades par souci de cohérence. Pour expliquer les avantages de ceci, «je ne sais pas ce que cela signifie. Cette fois, j'ai expliqué aussi brièvement que possible le point facile à comprendre que «la commodité et la simplicité sont compatibles avec la présence ou l'absence d'arguments de fonction et s'ils sont de première classe».


Recommended Posts

[Short Poem] Les appels de fonction Haskell / PureScript sont meilleurs que Ruby / Python / JavaScript
[Les débutants sont inquiets] Quel est le meilleur, Ruby, PHP ou Python?