Cet article apprend la programmation fonctionnelle sous les aspects suivants :
1. Quelle est la relation entre les formules mathématiques et la programmation fonctionnelle
Pour donner un exemple simple, il existe un concept en mathématiques appelé cartographie (y=f(x)). La plus familière devrait être la fonction quadratique (parabole y=a*x*x+b*x+c)
Maintenant, le codage implémente la valeur d'un certain point sur la parabole. Nous savons que a, b. , c sont des paramètres, x est la variable indépendante et y est la variable dépendante. Si c'était avant, je pourrais l'implémenter comme ça (afin de commémorer le c++ que je n'ai pas écrit depuis longtemps, je l'écrirai en c++)
double getParabola(double a,double b,double c,double x) { return a*x*x+b*x+c; }
Question 1. Étant donné Parabole, trouvez la valeur lorsque x=2, x=3, x=4, c'est la méthode suivante
resultA = getParabola(a,b,c,2) resultB = getParabola(a,b,c,2) resultC = getParabola(a,b,c,2)
C'est une méthode normale dans le programme. Cependant, d’un point de vue mathématique, existe-t-il un moyen de devenir cohérent avec la pensée mathématique ? Ce qui suit est une autre de mes implémentations (implémentée ici en utilisant go, car je sais écrire en C++),
func getParabola(aa,bb,cc float32){ var a = aa var b = bb var c = cc a := func(x float32) { return a*x*x+b*x+c } return a }
Ensuite, également pour la question 1, la solution est la suivante
parabola := getParabola(a,b,c) resultA := parabola(2) resultB := parabola(3) resultC := parabola(4)
est N'est-ce pas la même chose que trouver la valeur d'une fonction ? Les relations mathématiques sont donc bien représentées dans la programmation fonctionnelle.
2. Quelles sont les caractéristiques de la programmation fonctionnelle et quels concepts Go prend en charge
La programmation fonctionnelle a trois caractéristiques majeures
1. Immuabilité des variables : Une fois qu'une variable reçoit une valeur, elle ne peut plus être modifiée. Si des modifications sont nécessaires, elles doivent être copiées puis modifiées. Dans Go, une fois qu'une variable chaîne reçoit une valeur, elle ne peut pas être modifiée comme c[2]='a' comme en C++, elle doit plutôt être explicitement convertie en []byte puis modifiée. Mais c'est déjà un autre morceau de mémoire.
2. Citoyens fonctionnels de première classe : les fonctions sont également des variables et peuvent être transmises dans le programme sous forme de paramètres, de valeurs de retour, etc. Cette fonctionnalité doit être prise en charge à la fois par C++ et Go.
3. Récursion de queue : Le concept de récursion a été appris dans la séquence de Fibonacci. Si la récursion est très profonde, la pile peut exploser et provoquer une dégradation significative des performances. Quant à la technologie d'optimisation de la récursion de queue, si le compilateur la prend en charge, la pile peut être réutilisée dans chaque récursion (la récursion de queue signifie que l'appel récursif se produit à la dernière étape. À ce stade, les résultats précédents sont passés en paramètres à la dernière étape. de l'appel, donc l'état précédent n'a aucun effet, donc la pile peut être réutilisée).
Techniques courantes en programmation fonctionnelle
1. map&reduce&filter
map est utilisé pour appeler la même fonction pour chaque entrée afin de produire une sortie, telle que for_each en c++, map en hadoop, map en python, etc.
reduce est utilisé pour ajouter chaque entrée à la sortie précédente pour obtenir la sortie suivante, comme réduire en python et hadoop
filter est utilisé pour le filtrage, comme count_if de c++, etc. .
2. Récursion
3. Pipeline
Placez l'instance de fonction dans un tableau ou une liste, puis transmettez les données à la liste d'actions, et l'entrée est transmise séquentiellement. à chaque fonction fonctionne (ce qui signifie que la sortie de chaque fonction est utilisée comme entrée d'une autre fonction, les données circulent et le calcul est fixe, similaire au concept de tempête), et finalement nous obtenons le résultat souhaité.
4. Autres (à étudier plus en détail)
3. Programmation fonctionnelle et efficacité opérationnelle
Le concept le plus important de la programmation fonctionnelle est les équations de fonction. sont des citoyens de première classe, les fonctions et les variables sont les mêmes. Peut être utilisé comme paramètres, valeurs de retour, etc. L'utilisation d'instructions d'affectation est déconseillée, la récursivité est donc utilisée plus souvent, donc l'efficacité de la programmation fonctionnelle sera certainement inférieure.
Ce que j'utilise plus récemment, c'est la fermeture. Le concept de fermeture est un environnement (une ou plusieurs variables) plus une fonction. Chaque fois que l'expression de fermeture est évaluée, un isolement est obtenu. Fonction ordinaire.Une fonction ordinaire est un morceau de code exécutable.Tant que l'entrée est déterminée, la position d'appel est également déterminée. Par exemple, dans l'exemple de parabole ci-dessus, appeler
a:=getParabola(0.2,0.1,0.3) b:=getParabola(0.1,0.1,0.4)
entraînera deux paraboles. La raison pour laquelle je pense que l'efficacité sera réduite est que la clôture elle-même est un processus d'évaluation et d'affectation, impliquant la création et la destruction de variables. Bien sûr, je n’ai pas réellement testé les performances. Si l’efficacité du serveur des versions ultérieures diminue, c’est peut-être un élément à prendre en compte.
Pour plus de connaissances sur le langage go, veuillez faire attention à la colonne tutoriel sur le langage go sur le site Web PHP chinois.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!