Map
¶
CSL has the built-in type Map k v
which is a mapping between keys of type k
and values of type v
.
For example, a map of type Map Int MySumType
is a mapping between integers and some custom type MySumType
.
Maps can only be constructed using the functions in the standard library – there are no constructors for Map
.
This also means that it is not possible to do pattern-matching on Map
-values like it is with, e.g., List
.
The simplest way to create a Map
is by using the Map::fromList
function from the standard library:
val myMap = Map::fromList [(1, "One"), (2, "Two"), (3, "Three")]
val oneString = Map::lookup 1 myMap
// = Some "One"
val fourString = Map::lookup 4 myMap
// = None
Maps are immutable: when you insert an element a new map is created and returned:
val myNewMap = Map::insert 4 "Four" myMap
val fourString2 = Map::lookup 4 myNewMap
// = Some 4
val fourString3 = Map::lookup 4 myMap
// = None (Unchanged from above)
Note
A map is unordered: when you iterate over the elements in a map using Map::fold
you should not make any assumptions about the order the elements are returned.
Elements will be returned in some order but this order should not be assigned any special significance.
Map::empty : Map k v
¶
Returns a new empty map.
Map::insert : k -> v -> Map k v -> Map k v
¶
Returns a new map that contains, in addition to the keys already present in the argument map, the given key/value.
Examples¶
val noElms = Map::empty
val oneElm = Map::insert 1 "One" noElms
val twoElms = Map::insert 2 "Two" oneElm
Map::remove : k -> Map k v -> Map k v
¶
Returns a new map with the given key removed.
Examples¶
val myMap = Map::insert 1 "One" Map::empty
val myEmptyMap = Map::remove 1 myMap
// = Map::empty
val myMap2 = Map::remove 2 myMap
// = myMap
Map::lookup : k -> Map k v -> Maybe v
¶
Returns the value at the given key, if the key is in the map.
Otherwise it returns None
.
Examples¶
val myMap = Map::insert 1 "One" Map::empty
val oneVal = Map::lookup 1 myMap
// = Just "One"
val twoVal = Map::lookup 2 myMap
// = None
Map::lookupOrDefault : v -> k -> Map k v -> Maybe v
¶
Returns the value at the given key if the key is in the map. Otherwise returns the given default value..
Examples¶
val myMap = Map::insert 1 "One" Map::empty
val oneVal = Map::lookupOrDefault "Nothing" 1 myMap
// = "One"
val twoVal = Map::lookupOrDefault "Nothing" 2 myMap
// = "Nothing"
Map::fold : (k -> v -> a -> a) -> a -> Map k v -> a
¶
Fold over the key/value pairs in a map. As mentioned above, maps are unordered.
Examples¶
val sumKeysAndVals = Map::fold (\k -> \v -> \counter -> k + v + counter) 0
val x = sumKeysAndVals (Map::fromList [(1, 10), (2, 20)])
// = 1 + 10 + 2 + 20
Map::fromList : List (Tuple k v) -> Map k v
¶
Constructs a map that contains the elements in the given list.
Examples¶
val prices = Map::fromList [("hammer", 10), ("saw", 12), ("axe", 15)]
Map::toList : Map k v -> List (Tuple k v)
¶
The Map::toList
function constructs a list that contains the pairs of (key, value) in the given map.
As mentioned above, maps are unordered, so the order of elements of the original list is not guaranteed to be preserved.
Examples¶
val prices = Map::fromList [("hammer", 10), ("saw", 12), ("axe", 15)]
val priceList = Map::toList prices
// = [("axe", 15), ("hammer", 10), ("saw", 12)]