2017-05-04 3 views
0

J'essaie actuellement de comprendre les effets secondaires en général en ce qui concerne la programmation fonctionnelle, la raquette pour être exacte. Je crois comprendre qu'il s'agit de changer l'état d'une variable, comme une variable globale.Clarification des effets secondaires de la programmation fonctionnelle

Voici un code que j'ai écrit;

; Define a variable with the value of 5 
(define x 5) 

; Define a function to add 1 to x 
(define addX 
(+ 1 x)) 

; Test out values 
x 
addX 
x 

qui délivre 5 6 5.

Si pas la dernière valeur de 6? Ou est le principe fondamental qui me manque, le fait que la valeur est apatride lors de l'utilisation de la programmation fonctionnelle?

+0

Le commentaire est erroné dans votre code. Vous ne définissez jamais une fonction. – Sylwester

Répondre

2

La façon dont votre code est écrit, vous pouvez penser à x comme une constante - à savoir, addX ne le fait pas muter la x obligatoire.

Il est comme la même chose que (pseudocode)

constant X = 5 

constant addX = X + 1 

print(X)  ; 5 
print(addX) ; 6 
print(X)  ; 5 

Programmation fonctionnelle nécessite les immuables structures de données. Si vous approchez le schéma/la raquette avec des notions d'autres langages (de style impératif), vous aurez du mal et le code que vous produisez sera très mauvais.

+0

Merci un mil. En ce qui concerne les effets secondaires et en essayant de les lier à ce qui précède, comment cela serait-il expliqué? – morpheus1977

+0

Vous voulez éviter les effets secondaires dans un programme fonctionnel. La raquette a des fonctions de mutation (list ['set!'] (Https://docs.racket-lang.org/reference/set_.html)), mais vous voudrez comprendre leurs cas d'utilisation avant de les atteindre. – naomik

+0

Nous pourrions vous aider davantage si vous nous montrez ce que vous essayez de faire. '(+ 1 x)' est assez difficile de parler sans contexte car il pourrait faire partie de presque n'importe quel programme. – naomik

1

(+ 1 x) est une expression. Le résultat de cette expression, dans le cas où nous avons déjà (define x 5), est 6. Cette valeur juste ... s'infiltre à tout ce qui a essayé de l'évaluer. Que nous demandions à DrRacket de l'évaluer, ou que nous l'assignions à autre chose, comme (define addX (+ 1 x)), ce qui change est que l'expression devient la valeur. Par conséquent, si vous voulez attribuer une valeur à un identificateur déjà introduit, vous devez indiquer à l'interpréteur de faire cette affectation. Ce formulaire est set!, comme dans,

(define addX #f) 
addX ; => #f 
(set! addX (+ 1 x)) 
addX ; => 6 
+0

Merci pour votre réponse. Oui, je pense que je comprends maintenant ce qui se passe. À votre santé! – morpheus1977