diff --git a/F#/BracketSequence.Test/BracketSequence.Test.fsproj b/F#/BracketSequence.Test/BracketSequence.Test.fsproj
new file mode 100644
index 0000000..fe2ef9a
--- /dev/null
+++ b/F#/BracketSequence.Test/BracketSequence.Test.fsproj
@@ -0,0 +1,29 @@
+
+
+
+ net8.0
+
+ false
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/F#/BracketSequence.Test/BracketSequenceTest.fs b/F#/BracketSequence.Test/BracketSequenceTest.fs
new file mode 100644
index 0000000..e9d4e7b
--- /dev/null
+++ b/F#/BracketSequence.Test/BracketSequenceTest.fs
@@ -0,0 +1,40 @@
+module BracketSequence.Test
+
+open NUnit.Framework
+open FsUnit
+
+[]
+let emptyTest () =
+ "" |> checkBracketSequence |> should equal true
+
+[]
+let roundTest () =
+ "()" |> checkBracketSequence |> should equal true
+
+[]
+let roundIncorrectTest () =
+ "(()" |> checkBracketSequence |> should equal false
+
+[]
+let squareTest () =
+ "[]" |> checkBracketSequence |> should equal true
+
+[]
+let squareIncorrectTest () =
+ "[[]" |> checkBracketSequence |> should equal false
+
+[]
+let curlyTest () =
+ "{}" |> checkBracketSequence |> should equal true
+
+[]
+let curlyIncorrectTest () =
+ "{{}" |> checkBracketSequence |> should equal false
+
+[]
+let complicatedTest () =
+ "[({}){}[]]" |> checkBracketSequence |> should equal true
+
+[]
+let complicateIncorrectTest () =
+ "({[}){]}" |> checkBracketSequence |> should equal false
diff --git a/F#/BracketSequence/BracketSequence.fs b/F#/BracketSequence/BracketSequence.fs
new file mode 100644
index 0000000..e6572f3
--- /dev/null
+++ b/F#/BracketSequence/BracketSequence.fs
@@ -0,0 +1,44 @@
+module BracketSequence
+
+///
+/// Get corresponding opened bracket
+///
+/// Char to check
+/// If given char is any braket, returns corresponding opened bracket, None otherwise
+let bracketGetOpened str =
+ match str with
+ | '(' | ')' -> Some('(')
+ | '{' | '}' -> Some('{')
+ | '[' | ']' -> Some('[')
+ | _ -> None
+
+///
+/// Checks if string is correct bracket sequence
+///
+/// String to check
+/// If given bracket string is correct, true, false otherwise
+let rec checkBracketSequence str =
+ let rec bracketHelper list (openedStack: List) =
+ match list with
+ | [] -> openedStack.IsEmpty
+ | head::tail ->
+ let opened = bracketGetOpened head
+ match opened with
+ | Some (a) ->
+ let isOpened = a.Equals(head)
+ match openedStack with
+ | openedHead::openedTail ->
+ if isOpened then
+ bracketHelper tail (a::openedStack)
+ else if a.Equals(openedHead) then
+ bracketHelper tail openedTail
+ else
+ false
+ | [] ->
+ if isOpened then
+ bracketHelper tail [ a ]
+ else
+ false
+ | _ -> false
+ bracketHelper (Seq.toList str) List.empty
+
diff --git a/F#/BracketSequence/BracketSequence.fsproj b/F#/BracketSequence/BracketSequence.fsproj
new file mode 100644
index 0000000..b0d2e87
--- /dev/null
+++ b/F#/BracketSequence/BracketSequence.fsproj
@@ -0,0 +1,12 @@
+
+
+
+ net8.0
+ true
+
+
+
+
+
+
+
diff --git a/F#/forSpbu.sln b/F#/forSpbu.sln
index 9d54d03..e67474a 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}") = "BracketSequence", "BracketSequence\BracketSequence.fsproj", "{0D046BAA-DC97-4DED-8E10-9BF0D583988A}"
+EndProject
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "BracketSequence.Test", "BracketSequence.Test\BracketSequence.Test.fsproj", "{3198CB45-D4CF-4CFF-943C-4AB43E89B832}"
+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
+ {0D046BAA-DC97-4DED-8E10-9BF0D583988A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0D046BAA-DC97-4DED-8E10-9BF0D583988A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0D046BAA-DC97-4DED-8E10-9BF0D583988A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0D046BAA-DC97-4DED-8E10-9BF0D583988A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3198CB45-D4CF-4CFF-943C-4AB43E89B832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3198CB45-D4CF-4CFF-943C-4AB43E89B832}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3198CB45-D4CF-4CFF-943C-4AB43E89B832}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3198CB45-D4CF-4CFF-943C-4AB43E89B832}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{7937CDA8-8285-4E23-AD1A-FC0F04FEEFE6} = {91E3BDA2-0836-46C2-95F0-02513FD7F13F}