This shows you the differences between two versions of the page.
|
pp:26:teme:haskell-graphs-draft [2026/05/13 17:16] mihnea.muraru [Etapa 4] |
pp:26:teme:haskell-graphs-draft [2026/05/13 17:37] (current) mihnea.muraru [Changelog] |
||
|---|---|---|---|
| Line 252: | Line 252: | ||
| * 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ă**. | * 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''. | * 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**. | * 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 ''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 ''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ă**. | + | * 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'' | * ''StandardGraph'' | ||
| * Este cel din etapa 1, și este necesar următorului modul. | * Este cel din etapa 1, și este necesar următorului modul. | ||
| * Nu trebuie nimic implementat suplimentar aici. | * Nu trebuie nimic implementat suplimentar aici. | ||
| * ''Algorithms'' | * ''Algorithms'' | ||
| - | * Funcția ''dfsStack'' constituie o alternativă mai eficientă, bazată pe o stivă, a funcției ''dfs'' din etapa 1. | + | * 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ă. |
| - | * 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. | + | * **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 270: | 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 284: | 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 291: | 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ă. | ||