====== 7. Haskell type-classes ======
1. Enroll the type ''Extended'' shown below, in class ''Eq'':
data Extended = Infinity | Value Integer
2. Enroll the type ''Formula a'' in class ''Eq'':
data Formula a = Atom a |
Or (Formula a) (Formula a) |
And (Formula a) (Formula a) |
Not (Formula a)
3. Enroll the type ''Set a'', defined below, in class ''Num''. Implement operation ''(+)'' as set reunion and ''(*)'' as set intersection.
Implement also ''fromInteger'' which takes an integer x and returns the set ''{x}''.
data Set a = F (a->Bool)
4. In the last lab, we have worked with the following datatypes and functions:
data PExpr = Val Integer |
Var String |
PExpr :+: PExpr
eval_pexpr :: Dict -> PExpr -> Integer
data BExpr = PExpr :==: PExpr |
PExpr :<: PExpr |
Not BExpr |
BExpr :&&: BExpr
eval_bexpr :: Dict -> BExpr -> Bool
data Prog = PlusPlus Var |
Var :=: PExpr |
DeclareInt Var |
Begin Prog Prog |
While BExpr Prog |
If BExpr Prog Prog
eval :: Dict -> Prog -> Dict
We have three different datatypes and three evaluation methods, one for each type.
* The first type models arithmetic expressions and it's evaluation produces an integer
* The second type models boolean expressions (comparisons) and evaluates to a boolean
* The third type models programs and evaluates to a dictionary, holding the final values for each variable
Design a class called ''Eval'' which contains a unique ''eval'' method. How should the class parameters be?
Enrol types ''PExpr'', ''BExpr'' and ''Prog'' in this class, thus eliminating the need for multiple evaluation function names.