This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
laboratoare:05-polimorfism [2016/04/04 23:46] mihai.dumitru2201 [Type-classes] |
laboratoare:05-polimorfism [2016/04/05 15:58] (current) matei.popovici |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Type-classes ====== | + | ====== 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ă. | ||