Wednesday, January 11, 2017

My FSharp patter matching code kata

Given a list of numbers, detect when the values 2,3,4 are present one after the other.

module myModule =
    let rec consecutiveNumberDetector (input:list) =
        match input with
        | 2::t when t.Length>2 && (List.head t)=3 && (t |> List.tail |> List.head) =4 -> 
            "* got 2,3,4".Dump()
            consecutiveNumberDetector (t |> List.tail |> List.tail)
        | h::t ->
            String.Concat("* head is: " , h, " and tail is:", t).Dump()
            consecutiveNumberDetector t
        | [] -> "* Empty list".Dump(); 

let myList = [1;2;3;5;2;3;4;99]
myModule.consecutiveNumberDetector myList

Resulting output is:
* head is: 1 and tail is:[2; 3; 5; ... ]
* head is: 2 and tail is:[3; 5; 2; ... ]
* head is: 3 and tail is:[5; 2; 3; ... ]
* head is: 5 and tail is:[2; 3; 4; ... ]
* got 2,3,4
* head is: 99 and tail is:[]
* Empty list

Download the linqpad file here
See also more about pattern matching at
https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/match-expressions

No comments: