Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Adam_Eddy_FSharp/Adam_Eddy_FSharp.fsproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<Compile Include="Program.fs" />
</ItemGroup>

</Project>
58 changes: 58 additions & 0 deletions Adam_Eddy_FSharp/Program.fs
Original file line number Diff line number Diff line change
@@ -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>): int =
let rec sumList(list: ListOf<int>, 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))