This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
laboratoare:05-polimorfism [2016/04/05 15:44] matei.popovici |
laboratoare:05-polimorfism [2016/04/05 15:58] (current) matei.popovici |
||
---|---|---|---|
Line 139: | Line 139: | ||
care trateaza cazurile in care ''top'', ''pop'' si ''mpop'' produc eroare. | 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 ===== | ===== Alte exercitii ===== |