Maps in F#
Based on the given instruction, here’s the Go code example translated into F# along with the appropriate explanations in Markdown format suitable for Hugo.
Maps are F#’s built-in associative data type (sometimes called hashes or dicts in other languages).
To create an empty map, use:
let m = Map.empty<string, int>Set key/value pairs using typical map.[key] = value syntax.
let m = m.Add("k1", 7).Add("k2", 13)Printing a map with printfn will show all of its key/value pairs.
printfn "map: %A" mGet a value for a key with map.[key].
let v1 = m.["k1"]
printfn "v1: %d" v1If the key doesn’t exist, an exception is thrown. It’s safer to use tryFind which returns an Option type.
let v3 = m |> Map.tryFind "k3"
printfn "v3: %A" v3The Map.count returns the number of key/value pairs when called on a map.
printfn "len: %d" (Map.count m)To remove a key/value pair from a map, use Map.remove.
let m = m |> Map.remove "k2"
printfn "map: %A" mTo remove all key/value pairs from a map, use Map.empty.
let m = Map.empty<string, int>
printfn "map: %A" mThe optional second return value when getting a value from a map using tryFind indicates if the key was present in the map. This can be used to disambiguate between missing keys and keys with zero values like 0 or "".
let prs = m |> Map.tryFind "k2" |> Option.isSome
printfn "prs: %b" prsYou can also declare and initialize a new map in the same line with this syntax.
let n = Map.ofList [("foo", 1); ("bar", 2)]
printfn "map: %A" nThe Map module contains a number of useful utility functions for maps.
let n2 = Map.ofList [("foo", 1); ("bar", 2)]
if n = n2 then
printfn "n == n2"Note that maps appear in the form [k, v; k, v] when printed with printfn.
$ fsharpi maps.fsx
map: [("k1", 7); ("k2", 13)]
v1: 7
v3: None
len: 2
map: [("k1", 7)]
map: []
prs: false
map: [("bar", 2); ("foo", 1)]
n == n2Next example: Functions.
This translation leverages F#’s idiomatic features such as Map functions and pattern matching.