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.