Difference between revisions of "FP Laboratory 9"
Jump to navigation
Jump to search
Line 1: | Line 1: | ||
+ | <translate> | ||
== User defined data types and type classes == | == User defined data types and type classes == | ||
+ | </translate> | ||
<div style="float: right"> [[File:Video logo.png|80px|link=https://youtu.be/lo0pdwWoSx4]]</div> | <div style="float: right"> [[File:Video logo.png|80px|link=https://youtu.be/lo0pdwWoSx4]]</div> | ||
+ | |||
+ | <translate> | ||
Consider following representation of expressions | Consider following representation of expressions | ||
+ | </translate> | ||
<syntaxhighlight lang="Haskell"> | <syntaxhighlight lang="Haskell"> | ||
Line 14: | Line 19: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | * Create function eval that evaluates expresions. <div style="float: right"> [[File:Video logo.png|80px|link=https://youtu.be/AvThE0I4Iz8]]</div> | + | <translate> |
+ | * Create function eval that evaluates expresions. | ||
+ | </translate> | ||
+ | |||
+ | <div style="float: right"> [[File:Video logo.png|80px|link=https://youtu.be/AvThE0I4Iz8]]</div> | ||
<syntaxhighlight lang="Haskell"> | <syntaxhighlight lang="Haskell"> | ||
eval :: Expr -> Int | eval :: Expr -> Int | ||
Line 38: | Line 47: | ||
<div style="clear:both"></div> | <div style="clear:both"></div> | ||
− | * Create function showExpr that shows expression as a String. <div style="float: right"> [[File:Video logo.png|80px|link=https://youtu.be/cPL1zEZHLh0]]</div> | + | <translate> |
+ | * Create function showExpr that shows expression as a String. | ||
+ | </translate> | ||
+ | |||
+ | <div style="float: right"> [[File:Video logo.png|80px|link=https://youtu.be/cPL1zEZHLh0]]</div> | ||
<syntaxhighlight lang="Haskell"> | <syntaxhighlight lang="Haskell"> | ||
showExpr :: Expr -> String | showExpr :: Expr -> String | ||
Line 87: | Line 100: | ||
<div style="clear:both"></div> | <div style="clear:both"></div> | ||
− | * Extend class Show to be usable with our expressions. <div style="float: right"> [[File:Video logo.png|80px|link=https://youtu.be/NCAxJx_wJxI]]</div> | + | <translate> |
+ | * Extend class Show to be usable with our expressions. | ||
+ | </translate> | ||
+ | |||
+ | <div style="float: right"> [[File:Video logo.png|80px|link=https://youtu.be/NCAxJx_wJxI]]</div> | ||
<syntaxhighlight lang="Haskell" class="myDark"> | <syntaxhighlight lang="Haskell" class="myDark"> | ||
*Main> Add (Num 1) (Num 2) | *Main> Add (Num 1) (Num 2) | ||
Line 108: | Line 125: | ||
<div style="clear:both"></div> | <div style="clear:both"></div> | ||
− | * Create function derivation representing symbolic derivation of a given expression. | + | <translate> |
+ | * Create function derivation representing symbolic derivation of a given expression. | ||
+ | </translate> | ||
+ | |||
<syntaxhighlight lang="Haskell"> | <syntaxhighlight lang="Haskell"> | ||
deriv :: Expr-> Char -> Expr | deriv :: Expr-> Char -> Expr |
Revision as of 18:56, 20 October 2021
User defined data types and type classes
Consider following representation of expressions
data Expr = Num Int
| Add Expr Expr
| Sub Expr Expr
| Mul Expr Expr
| Div Expr Expr
| Var Char
deriving (Eq)
- Create function eval that evaluates expresions.
eval :: Expr -> Int
*Main> eval (Add (Num 1) (Num 2))
3
*Main> eval (Mul (Add (Num 1) (Num 2)) (Num 3))
9
eval :: Expr -> Int
eval (Num x) = x
eval (Add l r) = (eval l) + (eval r)
eval (Sub l r) = (eval l) - (eval r)
eval (Mul l r) = (eval l) * (eval r)
eval (Div l r) = (eval l) `div` (eval r)
- Create function showExpr that shows expression as a String.
showExpr :: Expr -> String
*Main> showExpr (Add (Num 1) (Num 2))
"1+2"
*Main> showExpr (Mul (Add (Num 1) (Num 2)) (Num 3))
"(1+2)*3"
*Main> showExpr (Mul (Add (Num 1) (Mul (Num 2) (Var 'x'))) (Mul (Num 3) (Var 'x')))
"(1+2*x)*3*x"
*Main> showExpr (Mul (Num 2) (Mul (Var 'x') (Var 'x')))
"2*x*x"
showExpr :: Expr -> String
showExpr expr = showExpr' expr NoOp
data Operation = Hi | HiDiv | Lo | LoSub | NoOp deriving (Eq)
showExpr' :: Expr -> Operation -> String
showExpr' (Num x) _ = show x
showExpr' (Var x) _ = [x]
showExpr' (Add l r) op = let
x = showExpr' l Lo ++"+"++showExpr' r Lo
in if op == Hi || op == HiDiv || op==LoSub
then "(" ++ x ++")"
else x
showExpr' (Sub l r) op = let
x = showExpr' l Lo ++"-"++showExpr' r LoSub
in if op == Hi || op == HiDiv || op==LoSub
then "(" ++ x ++")"
else x
showExpr' (Mul l r) op = let
x = showExpr' l Hi ++"*"++showExpr' r Hi
in if op == HiDiv
then "(" ++ x ++")"
else x
showExpr' (Div l r) op = let
x = showExpr' l Hi ++"/"++showExpr' r Hi
in if op == HiDiv
then "(" ++ x ++")"
else x
- Extend class Show to be usable with our expressions.
*Main> Add (Num 1) (Num 2)
"1+2"
*Main> Mul (Add (Num 1) (Num 2)) (Num 3)
"(1+2)*3"
*Main> Mul (Add (Num 1) (Mul (Num 2) (Var 'x'))) (Mul (Num 3) (Var 'x'))
"(1+2*x)*3*x"
*Main> Mul (Num 2) (Mul (Var 'x') (Var 'x'))
"2*x*x"
- Create function derivation representing symbolic derivation of a given expression.
deriv :: Expr-> Char -> Expr
*Main> deriv (Add (Num 1) (Num 2)) 'x'
0+0
*Main> deriv (Mul (Num 2) (Mul (Var 'x') (Var 'x'))) 'x'
0*x*x+2*(1*x+x*1)
*Main> deriv (Mul (Num 2) (Mul (Var 'x') (Var 'x'))) 'x'
0*x*x+2*(1*x+x*1)
deriv :: Expr-> Char -> Expr
deriv (Num _) _ = (Num 0)
deriv (Var x) y | x==y = (Num 1)
| otherwise = (Num 0)
deriv (Add l r) x = Add (deriv l x) (deriv r x)
deriv (Sub l r) x = Sub (deriv l x) (deriv r x)
deriv (Mul l r) x = Add (Mul (deriv l x) r) (Mul l (deriv r x))
deriv (Div l r) x =
Div
(Sub (Mul (deriv l x) r) (Mul l (deriv r x)))
(Mul r r)