Je joue actuellement avec LISP (en particulier Scheme et Clojure) et je me demande comment les structures de données typiques sont traitées dans les langages de programmation fonctionnels.
Par exemple, disons que je voudrais résoudre un problème en utilisant un algorithme de recherche de chemin de graphe. Comment pourrait-on généralement représenter ce graphique dans un langage de programmation fonctionnel (principalement intéressé par le style fonctionnel pur qui peut être appliqué à LISP)? Aurais-je simplement oublié les graphiques et résolu le problème d'une autre manière?
Les langages fonctionnels traitent les structures de données de la même manière que les langages non fonctionnels: en séparant l'interface de l'implémentation, en créant des types de données abstraits.
Vous pouvez créer des types de données abstraits dans Lisp. Par exemple, pour un graphique, vous voudrez peut-être quelques fonctions:
Une fois que vous avez créé cette interface dans un graphique, vous pouvez implémenter les structures de données réelles de différentes manières, en optimisant éventuellement des facteurs tels que l'efficacité du programmeur, la flexibilité et l'efficacité de calcul.
La clé est de s'assurer que le code qui utilise des graphiques utilise uniquement l'interface graphique et n'accède pas à l'implémentation sous-jacente. Cela gardera le code client plus simple car il est dissocié de l'implémentation réelle.
la source
Eh bien, cela dépendra si votre graphique est orienté / non orienté, pondéré / non pondéré, mais une façon de représenter un graphique orienté et pondéré (qui serait le plus général) consiste à utiliser une carte de cartes (dans Clojure)
représenterait une carte avec des nœuds: a: b et: c. : a pointe vers: b avec un poids de 3 et: c avec un poids de 4.: b pointe vers: a avec un poids de 1.: c ne pointe vers rien.
la source
En Common Lisp, si j'avais besoin de représenter un arbre, j'utiliserais soit une liste (si c'était juste pour un hack rapide), soit je définirais une classe d'arbre (ou struct, mais les classes interagissent bien avec les fonctions génériques, alors pourquoi pas) .
Si j'ai besoin d'arbres littéraux dans le code, je définirais probablement aussi une
make-tree
fonction qui prend une représentation de liste de l'arbre que je veux et le transforme en arbre d'arbres-objets.la source
Dans Haskell, la liste est la structure de données de base et si vous voulez des structures de données plus avancées, vous utilisez souvent des structures récursives comme un arbre est nul ou un nœud et deux arbres
la source