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.