diff --git a/Adam_Eddy_FSharp/Adam_Eddy_FSharp.fsproj b/Adam_Eddy_FSharp/Adam_Eddy_FSharp.fsproj
new file mode 100644
index 0000000..248c750
--- /dev/null
+++ b/Adam_Eddy_FSharp/Adam_Eddy_FSharp.fsproj
@@ -0,0 +1,12 @@
+
+
+
+ Exe
+ net9.0
+
+
+
+
+
+
+
diff --git a/Adam_Eddy_FSharp/Program.fs b/Adam_Eddy_FSharp/Program.fs
new file mode 100644
index 0000000..8ddbfeb
--- /dev/null
+++ b/Adam_Eddy_FSharp/Program.fs
@@ -0,0 +1,58 @@
+type ListOf<'T> = | Cons of head:'T * ListOf<'T> | Empty
+
+let x = Empty // An empty list
+let y = Cons(1, Empty) // Single item in list
+let z = Cons(1, Cons(2, Empty)) // Two item in list
+
+printfn "x=%O" x
+printfn "y=%O" y
+printfn "z=%O" z
+
+let nil() = Empty
+let createTwoItemList a b = Cons(a, Cons(b, Empty))
+
+let a = createTwoItemList 1 2
+printfn "a=%O" a
+
+let isNil<'T>(list: ListOf<'T>): bool=
+ match list with
+ | Empty -> true
+ | _ -> false
+
+let head<'T>(list: ListOf<'T>): Option<'T> =
+ match list with
+ | Cons( head:'T , _) -> Some(head)
+ | _ -> None
+
+let tail<'T>(list: ListOf<'T>): ListOf<'T> =
+ match list with
+ | Cons( head:'T , tail) -> tail
+ | Empty -> Empty
+
+let sum(list: ListOf): int =
+ let rec sumList(list: ListOf, total: int): int =
+ match head(list) with
+ | Some(x) -> sumList(tail(list), total + x)
+ | None -> total
+
+ sumList(list, 0)
+
+let rec fold<'L, 'A>(list: ListOf<'L>)(acc: 'A)(folder: ('A*'L)->'A ): 'A =
+ match head(list) with
+ | Some(x) -> fold(tail(list))(folder(acc , x))(folder)
+ | None -> acc
+
+
+printfn "isNil for empty list is %O" (isNil(x))
+printfn "isNil for non empty list is %O" (isNil(y))
+
+printfn "head for a list with stuff in %O" (head(y))
+
+printfn "tail for a list with stuff in %O" (tail(z))
+printfn "tail for a list which is empty %O" (tail(x))
+
+printfn "Sum a list = %O" (sum(z))
+
+printfn "Fold a list = %O" (fold(z)(0)(fun (a,b) -> a + b))
+
+printfn "Fold a list into a string = %O" (fold(z)("")(fun (a,b) -> sprintf "%s%d" a b))