This shows you the differences between two versions of the page.
|
pp:26:teme:haskell-graphs-draft [2026/05/13 16:59] mihnea.muraru [Etapa 4] |
pp:26:teme:haskell-graphs-draft [2026/05/13 17:37] (current) mihnea.muraru [Changelog] |
||
|---|---|---|---|
| Line 244: | Line 244: | ||
| * veți experimenta cu un stil de raționament specific programării funcționale, numit **//equational reasoning//** | * veți experimenta cu un stil de raționament specific programării funcționale, numit **//equational reasoning//** | ||
| - | * utilizându-l, veți **rafina** anumite implementări din etapele anterioare pentru un plus de **eficiență** și **modularitate**. | + | * utilizându-l, veți **rafina** anumite implementări din etapele anterioare pentru un plus de **eficiență**, **modularitate** și **reutilizare**, concomitent. |
| În etapa 4, **scheletul** conține următoarele module: | În etapa 4, **scheletul** conține următoarele module: | ||
| Line 251: | Line 251: | ||
| * Instanța clasei ''%%Foldable%%'' permite reducerea unui graf la o valoare. | * Instanța clasei ''%%Foldable%%'' permite reducerea unui graf la o valoare. | ||
| * Funcția ''nodesWithFoldr'' constituie o alternativă la funcția ''nodes'' din etapele 2-3, dar implementată de data aceasta cu ''foldr''. | * Funcția ''nodesWithFoldr'' constituie o alternativă la funcția ''nodes'' din etapele 2-3, dar implementată de data aceasta cu ''foldr''. | ||
| - | * | + | * Funcția ''nodesEdges'' combină prin **//tupling//** comportamentele funcțiilor ''nodes'' și ''edges'' într-o singură transformare compozițională, **mai eficientă** decât vechea implementare a lui ''edges'', dar din păcate **mai puțin modulară**. |
| + | * **Atenție!** Scopul este de a **nu** elabora de la zero implementarea, ci de a o obține prin **//equational reasoning//** urmărind indicațiile din comentarii. | ||
| + | * Constructorul de tip ''AlgebraicGraphFolder'' și funcția ''foldAlgebraicGraph'', **deja implementate**, constituie un mecanism de **reducere** croit pe constructorul de tip ''AlgebraicGraph'', fiind astfel mai expresiv decât instanța de ''Foldable''. | ||
| + | * Operatorii ''(<+>)'' și ''(>.>)'', **deja implementați**, permit **combinarea** unor ''AlgebraicGraphFolder''-e **independente**, respectiv **semidependente**. | ||
| + | * Funcția ''nodes'' este reimplementată utilizând noul mecanism de reducere. | ||
| + | * Funcția ''isNode'' verifică dacă un nod apare într-un graf, utilizând noul mecanism de reducere. | ||
| + | * Funcția ''edges'' este reimplementată prin **asamblarea** ''AlgebraicGraphFolder''-ului aferent funcției ''nodes'', cu un alt ''AlgebraicGraphFolder'', într-o manieră **semidependentă**, obținându-se concomitent un **plus** de eficiență, modularitate și reutilizare. | ||
| + | * ''StandardGraph'' | ||
| + | * Este cel din etapa 1, și este necesar următorului modul. | ||
| + | * Nu trebuie nimic implementat suplimentar aici. | ||
| + | * ''Algorithms'' | ||
| + | * Funcția ''dfsStack'' constituie o alternativă mai eficientă, bazată pe o stivă, a funcției ''dfs'' din etapa 1, în care fiecare element este vizitat cel mult o dată. | ||
| + | * **Atenție!** Scopul este de a **nu** elabora de la zero implementarea, ci de a o obține prin **//equational reasoning//** pornind de la implementarea din etapa 1 și de la indicațiile din comentarii. | ||
| - | constrângeri | + | Se impun următoarele **constrângeri**: |
| + | |||
| + | * Pentru funcțiile ''nodesEdges'' din modulul ''AlgebraicGraph'' și ''dfsStack'' din modulul ''Algorithms'', a căror implementare trebuie obținută prin **//equational reasoning//**, trebuie să redactați în comentarii, în porțiunea ''DERIVARE: ...'', pașii prin care ați trecut (vedeți exemplele și exercițiile din laboratorul 11). | ||
| Este suficient ca arhiva pentru **vmchecker** să conțină modulele ''AlgebraicGraph'', ''StandardGraph'' și ''Algorithms''. | Este suficient ca arhiva pentru **vmchecker** să conțină modulele ''AlgebraicGraph'', ''StandardGraph'' și ''Algorithms''. | ||
| Line 259: | Line 273: | ||
| ==== Depunctări ==== | ==== Depunctări ==== | ||
| - | Funcțiile care nu respectă constrângerile din schelet vor fi **depunctate total**. | + | Funcțiile care nu respectă constrângerile de mai sus sau pe cele din schelet vor fi **depunctate total**. |
| Line 273: | Line 287: | ||
| * [[https://ocw.cs.pub.ro/courses/_media/pp/26/teme/haskell/etapa2.zip|Schelet etapa 2]] | * [[https://ocw.cs.pub.ro/courses/_media/pp/26/teme/haskell/etapa2.zip|Schelet etapa 2]] | ||
| * [[https://ocw.cs.pub.ro/courses/_media/pp/26/teme/haskell/etapa3.zip|Schelet etapa 3]] | * [[https://ocw.cs.pub.ro/courses/_media/pp/26/teme/haskell/etapa3.zip|Schelet etapa 3]] | ||
| + | * [[https://ocw.cs.pub.ro/courses/_media/pp/26/teme/haskell/etapa4.zip|Schelet etapa 4]] | ||
| ===== Referințe ===== | ===== Referințe ===== | ||
| Line 280: | Line 295: | ||
| ===== Changelog ===== | ===== Changelog ===== | ||
| - | * 13.05, 17:30: Publicat etapa 4 | + | * 13.05, 17:40: Publicat etapa 4 |
| * 09.05, 21:02: Adăugat clarificare la etapa 2 despre semnificația constrângerii de recursivitate explicită. | * 09.05, 21:02: Adăugat clarificare la etapa 2 despre semnificația constrângerii de recursivitate explicită. | ||