(yes, this is a stale post - but since I had the same problem, figure I'll add an explanation to DeeJay's code to help out the next guy...)
The heart of the matter is that F#'s containers are all done in a "functional" style. Basically, this means they are immutable. Instead of manipulating elements held in a single mutable map object, the Map.add function returns a new map comprised of the given map and the supplied new key/element pair.
While it would be easy enough to substitute System.Collections.Generic.Dictionary into your code, let's take a look at how to use the Map in a functional setting.
The inner loop in DeeJay's code above (modified slightly, below) uses "List.fold_left" to accumulate a map with the keys found from a supplied list and an associated boolean value. The fold_left function accumulates intermediate maps as it folds the list (starting at the left), then returns the final accumulated resulting Map. Since the inner nodes in each intermediate map are shared between each of these maps, the operation is fairly efficient in both time and space.
The heart of the matter is that F#'s containers are all done in a "functional" style. Basically, this means they are immutable. Instead of manipulating elements held in a single mutable map object, the Map.add function returns a new map comprised of the given map and the supplied new key/element pair.
While it would be easy enough to substitute System.Collections.Generic.Dictionary into your code, let's take a look at how to use the Map in a functional setting.
The inner loop in DeeJay's code above (modified slightly, below) uses "List.fold_left" to accumulate a map with the keys found from a supplied list and an associated boolean value. The fold_left function accumulates intermediate maps as it folds the list (starting at the left), then returns the final accumulated resulting Map. Since the inner nodes in each intermediate map are shared between each of these maps, the operation is fairly efficient in both time and space.
#light type dayofweek = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday let is_weekend_map = let isWeekend day = match day with | Saturday | Sunday -> true | _ -> false [Monday;Tuesday;Wednesday;Thursday;Friday;Saturday;Sunday] |> List.fold_left (fun acc key -> acc |> Map.add key (isWeekend key) ) Map.empty
Use my all time favourite function... fold... in this case, left fold
As comparison is auto implemented for dayofweek... the custom comparison code is not need... at least for this section... and because of that you don't need to 'make' the map with a custom comparator... the standard map functions will use the built in *compare* (Pervasives).
see previous article: [link:cs.hubfs.net]
type dayofweek = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday
type daycategory = Weekday | Weekend
let is_weekend =
let f day = if (day = Saturday) || (day = Sunday) then Weekday else Weekend in
List.fold_left
(fun map day -> Map.add day (f day) map)
Map.empty
[Monday;Tuesday;Wednesday;Thursday;Friday;Saturday;Sunday]
As comparison is auto implemented for dayofweek... the custom comparison code is not need... at least for this section... and because of that you don't need to 'make' the map with a custom comparator... the standard map functions will use the built in *compare* (Pervasives).
see previous article: [link:cs.hubfs.net]
Topic tags
- f# × 3660
- compiler × 263
- functional × 199
- c# × 119
- websharper × 114
- classes × 96
- web × 94
- book × 84
- .net × 82
- async × 72
- parallel × 43
- server × 43
- parsing × 41
- testing × 41
- asynchronous × 30
- monad × 28
- ocaml × 26
- tutorial × 26
- haskell × 25
- workflows × 22
- html × 21
- linq × 21
- introduction × 19
- silverlight × 19
- wpf × 19
- fpish × 18
- collections × 14
- pipeline × 14
- templates × 12
- monads × 11
- opinion × 10
- reactive × 10
- plugin × 9
- scheme × 9
- sitelets × 9
- solid × 9
- basics × 8
- concurrent × 8
- deployment × 8
- how-to × 8
- python × 8
- complexity × 7
- javascript × 6
- jquery × 6
- lisp × 6
- real-world × 6
- workshop × 6
- xaml × 6
- conference × 5
- dsl × 5
- java × 5
- metaprogramming × 5
- ml × 5
- scala × 5
- visual studio × 5
- formlets × 4
- fsi × 4
- lift × 4
- sql × 4
- teaching × 4
- alt.net × 3
- aml × 3
- enhancement × 3
- list × 3
- reflection × 3
- blog × 2
- compilation × 2
- computation expressions × 2
- corporate × 2
- courses × 2
- cufp × 2
- enterprise × 2
- entity framework × 2
- erlang × 2
- events × 2
- f# interactive × 2
- fsc × 2
- google maps × 2
- html5 × 2
- http × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- keynote × 2
- mvc × 2
- numeric × 2
- obfuscation × 2
- oop × 2
- packaging × 2
- pattern matching × 2
- pipelines × 2
- rx × 2
- script × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- type × 2
- type provider × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- addin × 1
- agents × 1
- agile × 1
- android × 1
- anonymous object × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net mvc × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- b-tree × 1
- bistro × 1
- bug × 1
- camtasia studio × 1
- canvas × 1
- class × 1
- client × 1
- clojure × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- combinator × 1
- confirm × 1
- constructor × 1
- continuation-passing style × 1
- coords × 1
- coursera × 1
- csla × 1
- css × 1
- data × 1
- database × 1
- declarative × 1
- delete × 1
- dhtmlx × 1
- discriminated union × 1
- distance × 1
- docs × 1
- documentation × 1
- dol × 1
- domain × 1
- du × 1
- duf-101 × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- error × 1
- etw × 1
- euclidean × 1
- event × 1
- example × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- fantomas × 1
- fear × 1
- float × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- function × 1
- functional style × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- google × 1
- group × 1
- hash × 1
- history × 1
- hosting × 1
- httpcontext × 1
- https × 1
- hubfs × 1
- ie 8 × 1
- if-doc × 1
- inheritance × 1
- installer × 1
- interpreter × 1
- io × 1
- ios × 1
- ipad × 1
- kendo × 1
- learning × 1
- licensing × 1
- macro × 1
- macros × 1
- maps × 1
- markup × 1
- marshal × 1
- math × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- multidimensional × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- nested × 1
- nested loops × 1
- node × 1
- object relation mapper × 1
- object-oriented × 1
- offline × 1
- option × 1
- orm × 1
- osx × 1
- owin × 1
- paper × 1
- parameter × 1
- performance × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- programming × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- ptvs × 1
- quant × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- real-time × 1
- reference × 1
- restful × 1
- round table × 1
- runtime × 1
- scriptcs × 1
- scripting × 1
- service × 1
- session-state × 1
- sitelet × 1
- stickynotes × 1
- stress × 1
- strong name × 1
- structures × 1
- tdd × 1
- template × 1
- tracing × 1
- tsunamiide × 1
- type inference × 1
- type providers × 1
- upload × 1
- vb × 1
- vb.net × 1
- vector × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio shell × 1
- visualstudio × 1
- web api × 1
- webapi × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- xml × 1
|
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us |
Built with WebSharper |
type dayofweek = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday type daycategory = Weekday | Weekend let dow_index d = match d with Monday -> 1 | Tuesday -> 2 | Wednesday -> 3 | Thursday -> 4 | Friday -> 5 | Saturday -> 6 | Sunday -> 7 let day_compare d1 d2 = dow_index(d1) - dow_index(d2) // This is the map object. let is_weekend = let m : (dayofweek, daycategory) Map.CMapOps = Map.Make(day_compare) in [Monday;Tuesday;Wednesday;Thursday;Friday;Saturday;Sunday] |> List.iteri(fun i w -> let x = if i < 5 then Weekday else Weekend in m.add w x |> ignore); // Here is where I am having trouble. How do I add // elements to the map. mAlso can I just start of with Map.empty and then add elements to the map?
Thanks in advance
Chris