This shows you the differences between two versions of the page.
pp:21:laboratoare:haskell:clase [2021/04/19 23:21] bot.pp |
pp:21:laboratoare:haskell:clase [2021/04/24 19:18] (current) bot.pp |
||
---|---|---|---|
Line 2: | Line 2: | ||
* Data publicării: 19.04.2021 | * Data publicării: 19.04.2021 | ||
- | * Data ultimei modificări: 19.04.2021 | + | * Data ultimei modificări: 20.04.2021 |
===== Obiective ===== | ===== Obiective ===== | ||
Line 19: | Line 19: | ||
Polimorfismul este un mecanism al limbajului Haskell (și nu doar al acestuia) prin care se poate defini un **set de operații (interfață comună)** pentru mai multe tipuri. Categoriile de polimorfism pe care le vom întâlni cel mai des în Haskell sunt: parametric și ad-hoc. | Polimorfismul este un mecanism al limbajului Haskell (și nu doar al acestuia) prin care se poate defini un **set de operații (interfață comună)** pentru mai multe tipuri. Categoriile de polimorfism pe care le vom întâlni cel mai des în Haskell sunt: parametric și ad-hoc. | ||
- | ====== Polimorfism parametric ====== | + | ===== Polimorfism parametric ===== |
Așa cum ați observat în laboratoarele anterioare, Haskell permite definirea de funcții care operează pe structuri de date generice. Să luăm spre exemplu funcția ''%%length%%''. Aceasta permite calcularea lungimii oricărei liste, indiferent de tipul elementelor din listă. Această proprietate a limbajului poartă denumirea de **polimorfism parametric**. | Așa cum ați observat în laboratoarele anterioare, Haskell permite definirea de funcții care operează pe structuri de date generice. Să luăm spre exemplu funcția ''%%length%%''. Aceasta permite calcularea lungimii oricărei liste, indiferent de tipul elementelor din listă. Această proprietate a limbajului poartă denumirea de **polimorfism parametric**. | ||
Line 63: | Line 63: | ||
</code> | </code> | ||
- | Elementul de noutate este ''%%Eq a =>%%''. Acesta se numește **constrângere de tip** și apare ca urmare a folosirii funcției ''%%(==)%%''. Spre deosebire de funcția ''%%length%%'', care putea fi folosită indiferent de tipul listei, funcția ''%%elem%%'' este generică într-un sens mai restrâns. Ea funcționează doar pentru liste cu elemente care definesc egalitatea (operatorul ==). | + | Elementul de noutate este ''%%Eq a =>%%''. Acesta se numește **constrângere de tip** și apare ca urmare a folosirii funcției ''%%(==)%%''. Spre deosebire de funcția ''%%length%%'', care putea fi folosită indiferent de tipul listei, funcția ''%%elem%%'' este generică într-un sens mai restrâns. Ea funcționează doar pentru liste cu elemente care definesc egalitatea (operatorul ''%%==%%''). |
Cu alte cuvinte, ''%%elem%%'' poate fi aplicată pentru o listă de ''%%Int%%'' sau ''%%String%%'', pentru că știm să definim egalitatea pentru aceste tipuri, dar nu și pentru o listă de funcții. Deși pare neintuitiv, următoarea expresie: | Cu alte cuvinte, ''%%elem%%'' poate fi aplicată pentru o listă de ''%%Int%%'' sau ''%%String%%'', pentru că știm să definim egalitatea pentru aceste tipuri, dar nu și pentru o listă de funcții. Deși pare neintuitiv, următoarea expresie: | ||
Line 230: | Line 230: | ||
* ''%%Fractional%%'' -- clasă pentru numere reprezentabile ca fracții - definește funcția ''%%(/)%%'' | * ''%%Fractional%%'' -- clasă pentru numere reprezentabile ca fracții - definește funcția ''%%(/)%%'' | ||
* ''%%Floating%%'' -- clasă pentru numere reale - definește funcții ca ''%%sqrt%%'', ''%%exp%%'', ''%%sin%%'', ''%%cos%%'', etc. | * ''%%Floating%%'' -- clasă pentru numere reale - definește funcții ca ''%%sqrt%%'', ''%%exp%%'', ''%%sin%%'', ''%%cos%%'', etc. | ||
- | * ''%%Monad%%'' -- definește tipuri care pot reprezenta acțiuni monadice. Mai multe despre monade aici: Monade([[http://book.realworldhaskell.org/read/monads.html|http:%%//%%book.realworldhaskell.org/read/monads.html]]) | + | * ''%%Monad%%'' -- definește tipuri care pot reprezenta acțiuni monadice. Mai multe despre monade aici: [[http://book.realworldhaskell.org/read/monads.html|Monade]] |
===== Deriving ===== | ===== Deriving ===== | ||
Line 321: | Line 321: | ||
Pentru a afla informații despre clase în ''%%ghci%%'' se poate utiliza comanda ''%%:info <typeclass%%'' unde typeclass este clasa despre care dorim să aflăm informații. | Pentru a afla informații despre clase în ''%%ghci%%'' se poate utiliza comanda ''%%:info <typeclass%%'' unde typeclass este clasa despre care dorim să aflăm informații. | ||
- | Mai multe detalii aici([[http://www.haskell.org/tutorial/classes.html|http:%%//%%www.haskell.org/tutorial/classes.html]]) | + | Mai multe detalii [[http://www.haskell.org/tutorial/classes.html|aici]] |
===== Resurse ===== | ===== Resurse ===== |