Search code examples
f#active-pattern

Trying to understand F# active patterns, why can I do this:


I have a Dictionary over which I initially iterated thusly:

myDictionary |> Seq.iter (fun kvp -> doSomething kvp.Key kvp.Value)

Later, I discovered that I could make use of the KeyValue active pattern, and do this:

myDictionary |> Seq.iter (fun (KeyValue (k, v)) -> doSomething k v)

Knowing that active patterns aren't some form of preprocessor directive, how am I able to substitute the kvp argument in the lambda for a function that decomposes it?


Solution

  • Functions arguments call always be destructured using pattern matching. For instance:

    let getSingleton = fun [x] -> x
    let getFirst = fun (a,b) -> a
    let failIfNotOne = fun 1 -> ()
    let failIfNeitherOne = fun (x,1 | 1,x) -> ()
    

    Semantically, fun<pat>-><body> is roughly equivalent to

    fun x ->
    match x with
    |<pat>-><body>
    | _ -> raise MatchFailureException(...)