Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
pp:l05 [2019/03/24 18:27]
dmihai [Resurse]
pp:l05 [2020/02/05 15:50] (current)
dmihai [Exerciții]
Line 81: Line 81:
 O **clasă de tipuri** (**typeclass**) este o colecție de funcții care specifică un comportament. Un tip de date poate fi //​înrolat//​ într-o clasă, furnizând implementări ale funcțiilor,​ particularizate pentru acest tip.  O **clasă de tipuri** (**typeclass**) este o colecție de funcții care specifică un comportament. Un tip de date poate fi //​înrolat//​ într-o clasă, furnizând implementări ale funcțiilor,​ particularizate pentru acest tip. 
  
-<​note ​warning>+<​note ​important>
 În ciuda numelui, clasele Haskell nu corespund claselor din limbaje de programare orientate pe obiecte (e.g. Java, C%%+%%%%+%%). Clasele Haskell //nu conțin date// și //nu pot fi instanțiate//​. O comparație mai pertinentă este cu interfețele din Java. În ciuda numelui, clasele Haskell nu corespund claselor din limbaje de programare orientate pe obiecte (e.g. Java, C%%+%%%%+%%). Clasele Haskell //nu conțin date// și //nu pot fi instanțiate//​. O comparație mai pertinentă este cu interfețele din Java.
 </​note>​ </​note>​
Line 225: Line 225:
     Empty == Empty = True     Empty == Empty = True
     (Cons a as) == (Cons b bs) = (a == b) && (as == bs)     (Cons a as) == (Cons b bs) = (a == b) && (as == bs)
 +    _ == _ = False
 </​code>​ </​code>​
  
-Primul rând exprimă ideea că putem compara ​două liste //de același tip// (''​List a''​),​ doar dacă //​elementele lor sunt comparabile// (''​(Eq a) =%%>​%%''​).+Primul rând exprimă ideea că putem egala două liste //de același tip// (''​List a''​),​ doar dacă //​elementele lor sunt egalabile// (''​(Eq a) =%%>​%%''​).
  
 Observați că, în expresia celui de-al doilea caz, funcția ''​==''​ apare de două ori: o dată pentru a compara elemente, o dată pentru a compara liste. Acesta este un exemplu de **polimorfism ad hoc**. Cele două apeluri de ''​==''​ pot avea implementări diferite (al doilea este mereu un apel recursiv; primul poate fi, de exemplu, comparație între doi întregi, în cazul ''​List Int''​). Observați că, în expresia celui de-al doilea caz, funcția ''​==''​ apare de două ori: o dată pentru a compara elemente, o dată pentru a compara liste. Acesta este un exemplu de **polimorfism ad hoc**. Cele două apeluri de ''​==''​ pot avea implementări diferite (al doilea este mereu un apel recursiv; primul poate fi, de exemplu, comparație între doi întregi, în cazul ''​List Int''​).
Line 282: Line 283:
  
 <​note>​ <​note>​
-Respectarea strictă a tuturor legilor unei clase are excepții. De exemplu, pentru operațiile în virgulă mobilă, o valoare specială [[https://​en.wikipedia.org/​wiki/​NaN|NaN (Not a Number)]] modelează rezultatul anumitor expresii cu rezultat nedefinit. Două valori ''​NaN''​ nu sunt considerate egale; prin urmare, pentru tipuri ca ''​Float''​ și ''​Double'',​ operația ''​==''​ nu respectă proprietatea de reflexivitate:​+Respectarea strictă a tuturor legilor unei clase are excepții. De exemplu, pentru operațiile în virgulă mobilă, o valoare specială [[https://​en.wikipedia.org/​wiki/​NaN|NaN (Not a Number)]] modelează rezultatul anumitor expresii cu rezultat nedefinit. Două valori ''​NaN''​ nu sunt considerate egale; prin urmare, pentru tipuri ca ''​Float''​ și ''​Double'',​ operația ''​==''​ nu respectă proprietatea de reflexivitate ​pe întreg domeniul:
  
 <​code>​ <​code>​
Line 375: Line 376:
 b. înrolați ''​Expr''​ și ''​Extended''​ în clasa ''​Eval''​.\\ b. înrolați ''​Expr''​ și ''​Extended''​ în clasa ''​Eval''​.\\
 c. Ce observați? Cum ați putea simplifica? c. Ce observați? Cum ați putea simplifica?
 +
 +{{:​pp:​lab5_-_schelet.zip|Lab 5 - Schelet}}\\
 ===== Recommended Reading ===== ===== Recommended Reading =====
  
   * [[http://​learnyouahaskell.com/​types-and-typeclasses#​typeclasses-101|Learn you a Haskell for Great Good - Chapter 2: Types and Typeclasses#​Typeclasess 101]]\\   * [[http://​learnyouahaskell.com/​types-and-typeclasses#​typeclasses-101|Learn you a Haskell for Great Good - Chapter 2: Types and Typeclasses#​Typeclasess 101]]\\
-  * [[http://​learnyouahaskell.com/​making-our-own-types-and-typeclasses#​typeclasses-102|Learn you a Haskell for Great Good - Chapter 8: Making Our Own Types and Typeclasses#​Typeclasess ​101]]\\+  * [[http://​learnyouahaskell.com/​making-our-own-types-and-typeclasses#​typeclasses-102|Learn you a Haskell for Great Good - Chapter 8: Making Our Own Types and Typeclasses#​Typeclasess ​102]]\\
   * [[http://​book.realworldhaskell.org/​read/​using-typeclasses.html|Real World Haskell - Chapter 6: Using Typeclasses]]\\   * [[http://​book.realworldhaskell.org/​read/​using-typeclasses.html|Real World Haskell - Chapter 6: Using Typeclasses]]\\
   * [[https://​www.haskell.org/​tutorial/​stdclasses.html|A Gentle Introduction to Haskell - Chapter 8: Standard Haskell Classes]]   * [[https://​www.haskell.org/​tutorial/​stdclasses.html|A Gentle Introduction to Haskell - Chapter 8: Standard Haskell Classes]]