-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathChapter_06_ex_1.fs
More file actions
76 lines (63 loc) · 3.33 KB
/
Chapter_06_ex_1.fs
File metadata and controls
76 lines (63 loc) · 3.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
module Chapter_06_
#if INTERACTIVE
#r "packages/Unquote.2.2.2/lib/net40/unquote.dll"
#r "packages/NUnit.2.6.2/lib/nunit.framework.dll"
#endif
open System
open NUnit.Framework
open Swensen.Unquote
// 6.1 expression reduction
type Fexpr = | Const of float
| X
| Add of Fexpr * Fexpr
| Sub of Fexpr * Fexpr
| Mul of Fexpr * Fexpr
| Div of Fexpr * Fexpr
| Sin of Fexpr
| Cos of Fexpr
| Log of Fexpr
| Exp of Fexpr
let rec reduce expression =
match expression with
| Add(Const(left), Const(right)) -> Const(left + right)
| Add(leftOp, Const(0.0)) -> reduce(leftOp)
| Add(Const(0.0), rightOp) -> reduce(rightOp)
| Add(left, right) -> reduce(Add(reduce(left), reduce(right)))
| Sub(Const(left), Const(right)) -> Const(left - right)
| Sub(leftOp, Const(0.0)) -> reduce(leftOp)
| Sub(left, right) -> reduce(Sub(reduce(left), reduce(right)))
//| Sub(Const(0.0), rightOp) -> reduce(rightOp)
| Mul(Const(left), Const(right)) -> Const(left * right)
| Mul(leftOp, Const(0.0)) -> Const(0.0)
| Mul(Const(0.0), rightOp) -> Const(0.0)
| Mul(left, right) -> reduce(Mul(reduce(left), reduce(right)))
| Div(Const(left), Const(right)) -> Const(left / right)
//| Div(leftOp, Const(0.0)) -> Const(0.0)
| Div(Const(0.0), rightOp) -> Const(0.0)
| Div(left, right) -> reduce(Div(reduce(left), reduce(right)))
| Sin(expr) -> Sin(reduce(expr))
| Cos(expr) -> Cos(reduce(expr))
| Log(expr) -> Log(reduce(expr))
| Exp(expr) -> Exp(reduce(expr))
| expression -> expression
[<TestFixture>]
type ``Chapter 06 exercise 1 Tests``() =
[<Test>]
member x.``6.1 reducing trivial expressions``() =
test <@ reduce(Add(Const(7.0), Const(14.0))) = Const(21.0)@>
test <@ reduce(Add(Const(0.0), Const(14.0))) = Const(14.0)@>
test <@ reduce(Add(Const(7.0), Const(0.0))) = Const(7.0)@>
test <@ reduce(Sub(Const(7.0), Const(14.0))) = Const(-7.0)@>
test <@ reduce(Mul(Const(7.0), Const(14.0))) = Const(98.0)@>
test <@ reduce(Mul(Const(0.0), Const(14.0))) = Const(0.0)@>
test <@ reduce(Mul(Const(7.0), Const(0.0))) = Const(0.0)@>
test <@ reduce(Div(Const(7.0), Const(14.0))) = Const(0.5)@>
test <@ reduce(Div(Const(0.0), Const(14.0))) = Const(0.0)@>
test <@ reduce(Add(Mul(Const(7.0), Const(2.0)), Div(Const(10.0), Const(5.0)))) = Const(16.0) @>
test <@ reduce(Sub(Mul(Const(7.0), Const(2.0)), Div(Const(10.0), Const(5.0)))) = Const(12.0) @>
test <@ reduce(Mul(Mul(Const(7.0), Const(2.0)), Div(Const(10.0), Const(5.0)))) = Const(28.0) @>
test <@ reduce(Div(Mul(Const(7.0), Const(2.0)), Div(Const(10.0), Const(5.0)))) = Const(7.0) @>
test <@ reduce(Sin(Mul(Const(7.0), Const(2.0)))) = Sin(Const(14.0))@>
test <@ reduce(Cos(Mul(Const(7.0), Const(2.0)))) = Cos(Const(14.0))@>
test <@ reduce(Log(Mul(Const(7.0), Const(2.0)))) = Log(Const(14.0))@>
test <@ reduce(Exp(Mul(Const(7.0), Const(2.0)))) = Exp(Const(14.0))@>