A parameterized active pattern to match the first elements of an array
Been writing code in F# for almost a year and never blogged about it. Time to change that. Earlier today someone asked the following on twitter:
Is it possible to pattern match the first part of an array in #FSharp? Something like | 1::2::3::tail but for arrays? #lazyweb
I accepted the challenge :)
let (|Array|_|) pattern toMatch = let patternLength = Array.length pattern let toMatchLength = Array.length toMatch let tailLength = toMatchLength - patternLength if patternLength > toMatchLength then None else let firstElementsAreEqual = [ 0 .. (patternLength - 1) ] |> Seq.forall (fun i -> pattern.[i] = toMatch.[i]) if firstElementsAreEqual then Some(Array.sub toMatch patternLength tailLength) else None match [|1;2;3|] with | Array \[|1|] tail -> sprintf "bingo %i" (tail |> Array.sum) // the tail is [|2;3|\]
Or as a gist: https://gist.github.com/timvw/8717796.