Differences

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

Link to this comparison view

pp:21:laboratoare:haskell:clase [2021/04/19 17:34]
bot.pp created
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: [[http:%%//%%book.realworldhaskell.org/​read/​monads.html|Monade]]+  * ''​%%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 [[http:%%//%%www.haskell.org/​tutorial/​classes.html|aici]] +Mai multe detalii [[http://​www.haskell.org/​tutorial/​classes.html|aici]]
- +
-===== Exerciții ===== +
- +
-Exercițiile se găsesc în fișerul ''​%%PQueue.hs%%''​. +
- +
-Pentru primul exercițiu, asistentul trebuie să verifice dacă s-au definit cele 2 funcții ''​%%toList%%''​ și ''​%%fromList%%''​ utilizând operațiile ''​%%isEmpty%%'',​ ''​%%insert%%'',​ ''​%%empty%%'',​ ''​%%top%%'',​ ''​%%pop%%''​.+
  
 ===== Resurse ===== ===== Resurse =====
  
-  * [[https://​github.com/​cs-pub-ro/​PP-laboratoare/​blob/​master/​haskell/​clase/​haskell-cheatsheet-2.pdf|Cheatsheet]]+  * [[https://​github.com/​cs-pub-ro/​PP-laboratoare/​blob/​master/​haskell/​clase/​haskell-cheatsheet-3.pdf|Cheatsheet]]
   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​21/​laboratoare/​haskell/​clase-skel.zip|Schelet]]   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​21/​laboratoare/​haskell/​clase-skel.zip|Schelet]]
   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​21/​laboratoare/​haskell/​clase-sol.zip|Soluții]]   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​21/​laboratoare/​haskell/​clase-sol.zip|Soluții]]
  
  
pp/21/laboratoare/haskell/clase.1618842873.txt.gz · Last modified: 2021/04/19 17:34 by bot.pp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0