From 848a76d072d63c0909da69902345964e25bb9652 Mon Sep 17 00:00:00 2001 From: IgnatSergeev Date: Wed, 29 May 2024 22:10:08 +0300 Subject: [PATCH] Added realisations --- F#/ParseTree.Test/ParseTree.Test.fsproj | 29 ++++++++++++++++++++++ F#/ParseTree.Test/ParseTreeTest.fs | 32 +++++++++++++++++++++++++ F#/ParseTree/ParseTree.fs | 25 +++++++++++++++++++ F#/ParseTree/ParseTree.fsproj | 12 ++++++++++ F#/forSpbu.sln | 12 ++++++++++ 5 files changed, 110 insertions(+) create mode 100644 F#/ParseTree.Test/ParseTree.Test.fsproj create mode 100644 F#/ParseTree.Test/ParseTreeTest.fs create mode 100644 F#/ParseTree/ParseTree.fs create mode 100644 F#/ParseTree/ParseTree.fsproj diff --git a/F#/ParseTree.Test/ParseTree.Test.fsproj b/F#/ParseTree.Test/ParseTree.Test.fsproj new file mode 100644 index 0000000..0f60d35 --- /dev/null +++ b/F#/ParseTree.Test/ParseTree.Test.fsproj @@ -0,0 +1,29 @@ + + + + net8.0 + + false + true + true + + + + + + + + + + + + + + + + + + + + + diff --git a/F#/ParseTree.Test/ParseTreeTest.fs b/F#/ParseTree.Test/ParseTreeTest.fs new file mode 100644 index 0000000..176b69d --- /dev/null +++ b/F#/ParseTree.Test/ParseTreeTest.fs @@ -0,0 +1,32 @@ +module ParseTree.Test + +open NUnit.Framework +open FsUnit + +[] +let ValueParseTreeTest () = + Value 1 |> calulateParseTree |> should equal 1 + +[] +let SumParseTreeTest () = + Add(Value 1, Value 2) |> calulateParseTree |> should equal 3 + +[] +let SubtractParseTreeTest () = + Subtract(Value 1, Value 2) |> calulateParseTree |> should equal -1 + +[] +let MultiplyParseTreeTest () = + Multiply(Value 1, Value 4) |> calulateParseTree |> should equal 4 + +[] +let DivideParseTreeTest () = + Divide(Value 5, Value 2) |> calulateParseTree |> should equal 2 + +[] +let DivideZeroParseTreeTest () = + (fun () -> Divide(Value 5, Value 0) |> calulateParseTree |> ignore) |> should throw typeof + +[] +let ActualParseTreeTest () = + Add(Value 2, Multiply(Divide(Value 6, Value 2), Value 2)) |> calulateParseTree |> should equal 8 diff --git a/F#/ParseTree/ParseTree.fs b/F#/ParseTree/ParseTree.fs new file mode 100644 index 0000000..7491873 --- /dev/null +++ b/F#/ParseTree/ParseTree.fs @@ -0,0 +1,25 @@ +module ParseTree + +type MaybeBuilder() = + member this.Bind(m, f) = Option.bind f m + member this.Return(x) = + Some x + member this.ReturnFrom(m) = + m + +let maybe = new MaybeBuilder() + +type ParseTree<'T> = + | Value of 'T + | Add of ParseTree<'T> * ParseTree<'T> + | Subtract of ParseTree<'T> * ParseTree<'T> + | Divide of ParseTree<'T> * ParseTree<'T> + | Multiply of ParseTree<'T> * ParseTree<'T> + +let rec calulateParseTree tree = + match tree with + | Value value -> value + | Add (lhs, rhs) -> calulateParseTree lhs + calulateParseTree rhs + | Subtract (lhs, rhs) -> calulateParseTree lhs - calulateParseTree rhs + | Multiply (lhs, rhs) -> calulateParseTree lhs * calulateParseTree rhs + | Divide (lhs, rhs) -> calulateParseTree lhs / calulateParseTree rhs diff --git a/F#/ParseTree/ParseTree.fsproj b/F#/ParseTree/ParseTree.fsproj new file mode 100644 index 0000000..3756dd0 --- /dev/null +++ b/F#/ParseTree/ParseTree.fsproj @@ -0,0 +1,12 @@ + + + + net8.0 + true + + + + + + + diff --git a/F#/forSpbu.sln b/F#/forSpbu.sln index 9d54d03..eb92715 100644 --- a/F#/forSpbu.sln +++ b/F#/forSpbu.sln @@ -21,6 +21,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "07.03", "07.03", "{5CA9053B EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Homework1", "Homework1\Homework1.fsproj", "{04B15EE4-079A-42ED-ACC8-E2DCD25281C6}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ParseTree", "ParseTree\ParseTree.fsproj", "{AA554FFB-4385-4C2F-BF0E-947C705626D4}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ParseTree.Test", "ParseTree.Test\ParseTree.Test.fsproj", "{63396A84-710E-4539-8570-46F80B88D933}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -58,6 +62,14 @@ Global {89A935E8-B5F3-435D-ACC3-A99DD7C66178}.Debug|Any CPU.Build.0 = Debug|Any CPU {89A935E8-B5F3-435D-ACC3-A99DD7C66178}.Release|Any CPU.ActiveCfg = Release|Any CPU {89A935E8-B5F3-435D-ACC3-A99DD7C66178}.Release|Any CPU.Build.0 = Release|Any CPU + {AA554FFB-4385-4C2F-BF0E-947C705626D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA554FFB-4385-4C2F-BF0E-947C705626D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA554FFB-4385-4C2F-BF0E-947C705626D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA554FFB-4385-4C2F-BF0E-947C705626D4}.Release|Any CPU.Build.0 = Release|Any CPU + {63396A84-710E-4539-8570-46F80B88D933}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63396A84-710E-4539-8570-46F80B88D933}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63396A84-710E-4539-8570-46F80B88D933}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63396A84-710E-4539-8570-46F80B88D933}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {7937CDA8-8285-4E23-AD1A-FC0F04FEEFE6} = {91E3BDA2-0836-46C2-95F0-02513FD7F13F}