Quelqu'un a-t-il un bon modèle mental ou une bonne métaphore pour la programmation fonctionnelle qui fait référence à quelque chose dans le monde réel?
La programmation orientée objet a un sens intuitif pour moi. Il y a des choses qui ont des propriétés et parfois elles peuvent aussi faire des choses ou effectuer des calculs sur leurs propriétés (méthodes). (Ex: voiture, forme, chat).
Je ne supporte aucune programmation fonctionnelle et je ne suis pas intéressé par un débat sur les vertus des deux. J'ai juste besoin d'une métaphore ou d'un modèle mental pour travailler comme je l'ai fait avec la programmation orientée objet.
Quels sont les bons modèles mentaux ou les métaphores du monde réel pour la programmation dans un paradigme fonctionnel? Il y a quelque chose dans les fonctions composées de fonctions de traitement de fonctions qui laisse une personne sans place ferme pour se tenir debout et cogiter.
la source
Réponses:
La programmation fonctionnelle consiste à coller des fonctions plus petites pour obtenir vos résultats. Un modèle mental décent (pour moi, au moins) est une chaîne de montage. Chaque fonction qui est composée est une étape de plus dans le processus d'assemblage. Considérez cette fonction ici:
Dans Haskell, cette fonction renverra le plus petit élément d'une liste. La chaîne d'assemblage trie d'abord l'entrée, puis retourne le premier élément (en supposant qu'il est trié du moins au plus grand.) Si nous voulions obtenir uniquement la plus petite valeur paire, nous pouvons changer la ligne d'assemblage pour ressembler à ce qui suit:
Ce n'est qu'un pas de plus sur la bande transporteuse.
En un mot, les fonctions décrivent simplement les étapes prises pour convertir l'entrée brute (les pièces) en bien traité (la sortie).
la source
(f . g) (x)
moyensf(g(x))
ou desf . g
moyens\x -> f (g (x))
..
on définit; ce n'est pas ainsi que fonctionne Haskell en général . Vous pourriez tout aussi bien définir l'opérateur de tuyau avant de F # (|>
) dans Haskell et écriresmallest x = (sort x) |> head
et les données circuleraient correctement. Je pensais juste le souligner.Mathématiques. La programmation fonctionnelle est inspirée et modelée sur les mathématiques. Les fonctions mathématiques n'ont pas d'état, n'ont pas d'effets secondaires, etc., et il en est de même avec FP. Si vous pensez à FP en termes de fonctions mathématiques plutôt que d'utiliser une approche de type OO "comment puis-je faire cela", vous serez en bonne forme. Cependant, si vous essayez d'apporter des sensibilités OO à la PF, vous nagerez à contre-courant.
la source
Que diriez-vous d'un flip book ?
Dans un flip book, chaque page représente le monde tel qu'il existe à un moment donné. Dans notre programme, le monde est représenté comme une structure de données composée (par exemple, nous avons une banane qui est dans la main d'un gorille qui est dans un arbre qui est dans une jungle). Chaque page suivante fait avancer l'histoire en modifiant légèrement la représentation précédente. Dans FP, les structures de données persistantes ont été conçues pour réutiliser efficacement les structures précédentes afin qu'un changement ne fournisse qu'un delta et non un rendu complètement nouveau.
Ce qui peut ne pas être évident, c'est qu'une page de notre flip book représenterait également des actifs incorporels. Par exemple, si le gorille laisse tomber la banane, nous pourrions commencer à appliquer les effets de la gravité sur sa décente et son accélération vers le sol de la jungle. Pour s'adapter à cela, nous attacherions des attributs tels que la vitesse et la trajectoire à notre banane.
Dans notre programme, il y aurait une fonction qui accepte une page de flip book (alias l'état du monde) comme argument et génère une nouvelle page . De cette manière, notre histoire est racontée sans jamais réellement changer l'état des objets existants. Nous remplaçons simplement chaque page par une nouvelle en utilisant ce qui est effectivement un calcul.
la source
Des relations.
Ami: Étant donné deux personnes, une relation d'ami suit ces lois générales
Monoïde: étant donné plusieurs éléments et une fonction qui prend 2 des éléments et renvoie 1, une relation monoïde suit ces lois générales
La programmation fonctionnelle est une question de généralisation, l'ami est une relation très générale qui peut être vue dans de nombreux scénarios, mais dans tous les différents formats, elle suit généralement les lois ci-dessus.
En reconnaissant les lois qui régissent les relations entre les choses, vous pouvez créer des implémentations générales qui fonctionnent sur n'importe quel format de choses ayant ce type de relation. Dans la programmation fonctionnelle, vous essayez d'identifier les relations entre les choses afin qu'elles puissent être classées et traitées en général.
Vous voulez une métaphore du monde réel? Regardez comment les choses sont liées et essayez d'identifier les lois générales (comme cela s'applique à plusieurs scénarios où des choses autres que les lois peuvent varier). Il y a une relation entre un commis au registre et un acheteur dans un magasin, il a des lois générales, un logiciel a été développé pour faciliter les objectifs des personnes dans cette relation générale à la manière des systèmes de point de vente. De même, lorsque vous commencez à voir ces lois générales dictant la façon dont les choses sont liées, vous pouvez commencer à vous fier aux lois de ces relations pour écrire votre logiciel plutôt qu'aux détails spécifiques d'une instance de relation.
la source
Tout est une valeur, et vous appliquez des fonctions à des valeurs (qui peuvent être des fonctions) pour produire de nouvelles valeurs, de préférence sans produire d'effets secondaires.
la source
La chose clé à réaliser à propos de la programmation fonctionnelle est que tout est une valeur - même le code lui-même est des «valeurs».
Le meilleur exemple d'un environnement de programmation fonctionnel simple est celui de l'outil professionnel préféré de tous - la feuille de calcul. Chaque cellule de la feuille de calcul est soit des données, soit le résultat d'une fonction. De plus, cette fonction ne peut pas désactiver et modifier une autre cellule.
Quand on passe à un langage fonctionnel, au lieu d'une grille cartésienne de
A1
etB42
, les fonctions ont des noms. C'est vraiment tout.Il y a d'autres aspects que l'on peut ajouter au-delà de cela ... mais c'est la programmation fonctionnelle à la base. Il ne faut pas se soucier de la structure des listes ou du regroupement des choses. La programmation fonctionnelle consiste à transmettre une valeur à une fonction et à récupérer une valeur sans avoir à nettoyer ailleurs dans la mémoire.
C'est ça. La programmation fonctionnelle est une feuille de calcul avec des noms plutôt qu'une grille.
la source
Vous pouvez penser à la programmation fonctionnelle comme à des comportements . Un programme est une description du comportement que vous souhaitez que l'ordinateur applique. Les fonctions sont l'unité de base du comportement, et la composition des fonctions est un moyen de construire de plus grands comportements à partir de plus petits.
Dans la POO, un objet de code est destiné à être l'état d'un objet dans le domaine de problème; il change au fil du temps pour refléter les changements dans cet objet de domaine. Dans FP, une valeur représente l'état d'un objet de domaine; il ne change jamais, vous créez simplement des valeurs différentes pour représenter différents états.
Je trouve le modèle fonctionnel un peu plus honnête sur ce que les ordinateurs font réellement - représenter. Après tout, je ne peux pas simplement évoquer un
new Tesla()
air hors du commun. :)la source
Les phrases sont plus fonctionnelles qu'orientées aux objets, en supposant que vous les décomposiez plus ou moins comme suit ...
Nous devons donc trouver les phrases de tête, puis le reste:
En une fois:
Analyser l'arbre:
La parcimonie infecte la pensée fonctionnelle;
Chapeau à Gottlieb Frege dans les années 1890, Alan Turing (entschiedungsprobleme) dans les années 1930, Noam Chomsky (dans les années 1960).
la source