User Tools

Site Tools


laboratoare:05-polimorfism

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
laboratoare:05-polimorfism [2016/04/04 23:51]
mihai.dumitru2201 [Type-classes]
laboratoare:05-polimorfism [2016/04/05 15:58] (current)
matei.popovici
Line 1: Line 1:
-====== Clase de tipuri ======+====== Clase de tipuri ​(Type-classes) ​======
  
 Responsabili laborator: ​ Responsabili laborator: ​
Line 123: Line 123:
 ===== Exerciții ===== ===== Exerciții =====
  
 +1. Fie urmatorul TDA:
 +<​code>​ data Result a = Value a | Error </​code>​
 +ale carui valori pot fi folosite pentru a modela conceptul de eroare (exceptie).
 +
 +Definiti pentru tipul:
 +<​code>​ data FIFO a = P [a] [a] </​code>​
 +
 +operatiile:
 +<​code>​
 +push :: a -> FIFO a -> Result (FIFO a)
 +pop :: FIFO a -> Result (FIFO a)
 +mpop :: Integer -> FIFO a -> Result (FIFO a)
 +top :: FIFO a -> Result a
 +</​code>​
 +
 +care trateaza cazurile in care ''​top'',​ ''​pop''​ si ''​mpop''​ produc eroare.
 +//Hint:// Pentru ''​mpop'',​ folositi **case** si **guards**.
 +
 +2. Inrolati ''​FIFO a''​ in clasa ''​Show''​
 +
 +3. Definiti un tip de date asociat urmatoarei gramatici:
 +<​code>​
 +   <​expr>​ ::= <​value>​ | <​variable>​ | <​expr>​ + <​expr>​ | <​expr>​ * <​expr> ​
 +</​code>​
 +unde o valoare poate avea orice tip.
 +
 +4. Consideram urmatorul constructor de tip:
 +<​code>​
 +type Dictionary a = [(String,​a)]
 +</​code>​
 +care modeleaza //​dictionare//​ - mapari de tip "​nume-variabila"​-"​valoare polimorfica"​
 +
 +Definiti functia:
 +<​code>​valueof :: Dictionary a -> String -> Result a</​code>​
 +care intoarce valoarea asociata unui nume-variabila,​ dintr-un dictionar
 +
 +5. Definiti urmatoarea clasa:
 +<​code>​
 +class Eval t a where
 +    eval :: Dictionary a -> t a -> Result a
 +</​code>​
 +
 +Spre deosebire de clasele prezentate in exemplele anterioare, care desemneaza o //​proprietate//​ a unui tip sau constructor de tip, ''​Eval''​ stabileste o **relatie** intre un constructor de tip ''​t''​ si un tip ''​a''​. Relatia spune ca orice container de tip ''​t a''​ poate fi evaluat in prezenta unui dictionar cu valori de tip ''​a'',​ la o valoare de tip ''​Result a''​.
 +
 +6. Inrolati ''​Expr''​ si ''​Integer''​ in clasa ''​Eval''​. Care este semnificatia evaluarii?
 +
 +7. Inrolati ''​Expr''​ si ''​FIFO a''​ in clasa ''​Eval''​. Semnificatia inmultirii este //​concatenarea//​ a doua FIFO. 
 +
 +===== Alte exercitii =====
 1. Ați definit, în laboratorul anterior, tipurile polimorfice ''​List a''​ și ''​Tree a''​. Pentru le putea reprezenta, ați folosit implementarea implicită a funcției ''​show'',​ oferită de ''​deriving (Show)''​. Aceasta nu era însă o reprezentare citibilă. 1. Ați definit, în laboratorul anterior, tipurile polimorfice ''​List a''​ și ''​Tree a''​. Pentru le putea reprezenta, ați folosit implementarea implicită a funcției ''​show'',​ oferită de ''​deriving (Show)''​. Aceasta nu era însă o reprezentare citibilă.
  
laboratoare/05-polimorfism.1459803063.txt.gz · Last modified: 2016/04/04 23:51 by mihai.dumitru2201