C'est une question théorique, mais après de nombreuses années de programmation dans ce que je réalise maintenant comme une technique impérative "normale", utilisant principalement le C ++, j'ai découvert cet autre monde de programmation fonctionnelle, sur lequel je suis tombé par hasard tout en apprenant avec désinvolture JavaScript.
Cela m'a amené à me demander si vous pouviez techniquement remplacer un programme complet orienté état par une implémentation différente purement fonctionnelle et sans état?
C'est une idée intrigante et je dois admettre qu'il y a une clarté et une élégance dans la programmation fonctionnelle qui m'a vraiment époustouflé.
Réponses:
Réponse courte: oui. Selon Wikipedia, l'équivalence du calcul lambda aux machines de Turing en tant que modèle universel de calcul a été montrée en 1937 par Alan Turing. Le modèle de calcul d'une machine de Turing est ce que vous avez généralement à l'esprit lorsque vous parlez de programmation impérative ou avec état, et le calcul lambda est une formalisation mathématique de la «programmation fonctionnelle pure».
On suppose que tout modèle de calcul efficace est capable d'effectuer les mêmes calculs qu'une machine de Turing et vice versa. C'est ce qu'on appelle la thèse de Church-Turing . Cette conjection, cependant, ne peut pas être prouvée, en raison du terme plus ou moins intuitif de "modèle efficace de calcul" (peut-être que quelqu'un inventera un nouveau modèle à l'avenir?)
la source
Quel que soit le système dynamique, «l'état» est ce qui fait que votre présent est influencé par votre passé ou votre futur (la flèche du temps n'est pas un problème mathématique, juste une contrainte physique).
Que vous ayez quelque chose à retenir ou que cela dépende de ce que vous avez fait, vous avez un état.
Un système sans état n'est pas "dynamique": c'est juste une fonction combinatoire. Cela peut ne pas avoir d'état, mais pour produire des résultats différents, il faut que l'état soit fourni d'une manière ou d'une autre.
Maintenant, selon le modèle de calcul auquel vous vous référez, un état peut être représenté explicitement (sous forme de variable) ou implicitement (sous forme d '"adresses de retour").
quand vous le faites,
fna(fnb(x))
vous donnez un état à fnb qui à son tour produira un état pour fna. Cela est dû au fait qu'ilx
existe avant que fnb soit appelé (donc, il vient de son propre "passé").Ce n'est pas une question d '«état exisit» ou «état n'existe pas». C'est une question de «je m'en soucie» ou de «je m'en fiche».
la source
État signifie la capacité de répondre à un stimulus présent d'une manière qui dépend des stimuli passés, et pas seulement basée sur le stimulus actuel.
Les programmes purement fonctionnels ne sont que des fonctions. Ainsi, pour des applications pratiques, le programme purement fonctionnel entre une paire (old_state * present_stimulus) et sort une paire (new_state * present_response). Un "looper" externe et dynamique est nécessaire pour attendre le prochain stimulus et propager l'état.
Un programme purement fonctionnel n'a pas intrinsèquement d'état et ne peut pas être utilisé directement pour des applications pratiques.
Ainsi, aucun programme orienté état ne peut être remplacé par une implémentation différente purement fonctionnelle et sans état.
la source
Vous pouvez éviter un état mutable explicite tant que vous n'avez pas à interagir avec le monde extérieur.
En JavaScript, pour que votre programme ait réellement un effet au-delà de la prise de cycles de processeur, vous devez modifier le Dom ou l'objet Window, et ces API sont avec état. Mais je suppose que vous pouvez créer un wrapper qui transmet les objets Dom et Window en tant que paramètres au code JavaScript, puis reçoit un nouveau Dom / Window en sortie. Cela isolerait le code JavaScript de l'état mutable.
Bien sûr , vous êtes toujours basez sur l' état, depuis la fenêtre du navigateur et DOM est stateful par nature. Toute application interactive est intrinsèquement avec état, mais vous pouvez toujours structurer votre code de manière à minimiser l'état explicite.
Une autre question est de savoir si c'est une bonne idée. Même Haskell, qui est un langage fonctionnel pur par conception, comprend la monade «état», qui vous permet de simuler un état mutable. Cela montre que l'état mutable explicite est parfois vraiment un modèle souhaitable.
la source
Pensez à la façon dont vous implémenteriez une "machine d'état" dans un langage de programmation sans état.
Vous pourriez probablement le faire, mais vous finiriez par utiliser des noms de fonction comme stockage. Se retrouver avec un gobblyday comme:
la source