Hi,
as already mentioned, the problem with design patterns is that they make sense mostly in "pure" object oriented environment like Java or C#. I agree that it would be very interesting to find what are good design patterns in functional programming. For F# we have to go a bit furthere, because it allows you to write mixed OO & functional code, so we need good mixed design patterns.
For the abstract factory, you may try something like following:
(however, the idea behind abstract factory is that you want to create implementation of abstract type/interface, which may not always be the most suitable abstraction in F# - in this sample I use GUI controls, where I think using interfaces makes very good sense).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
#light // Abstract interfaces for Button and Label type IButton = interface abstract member GetCaption : unit -> string abstract member SetCaption : string -> unit abstract member Draw : unit -> unit end type ILabel = interface abstract member Draw : unit -> unit end // Factory is a set of functions for creating concrete implementations type Factory = { createButton : unit -> IButton; createLabel : unit -> ILabel } // Windows factory - returns Factory with a windows functions // (interfaces are implemented using F# object expressions) let windowsFactory = { createButton = fun () -> let capt = ref "" { new IButton with Draw() = printfn "Windows button [%s]" !capt and GetCaption() = !capt and SetCaption(v) = capt := v }; createLabel = fun () -> { new ILabel with Draw() = printfn "Windows label!" } } // MacOS factory - returns Factory with a Mac functions let macFactory = { createButton = fun () -> let capt = ref "" { new IButton with Draw() = printfn "MacOS button [%s]" !capt and GetCaption() = !capt and SetCaption(v) = capt := v }; createLabel = fun () -> { new ILabel with Draw() = printfn "MacOS label!" } } // Gives factory for specified OS let factory os = match os with | "Windows" -> windowsFactory | "Mac" -> macFactory | _ -> failwith "Sorry!" // DEMO let f1 = factory "Windows" let f2 = factory "Mac" let b1 = f1.createButton() let b2 = f2.createButton() b1.SetCaption("Hi there!") b2.SetCaption("Hi there!") b1.Draw(); b2.Draw();
Hope this helps a bit,
Tomas
Don't forget that most object-oriented design patterns are redundant in a functional programming language like F#.
For example, the (incomplete!) hundred line example for the "abstract factory pattern" by the GoF translates into four lines of F#:
1 2 3 4 5
type carnivore = Lion | Wolf type herbivore = Wildebeest | Bison let eats predator prey = any_to_string predator^" eats "^any_to_string prey
I think it would be a good exercise to work out which OO design patterns correspond to which functional programming constructs and translate the examples accordingly.
Don't forget that most object-oriented design patterns are redundant in a functional programming language like F#.
For example, the (incomplete!) hundred line example for the "abstract factory pattern" by the GoF translates into four lines of F#:type carnivore = Lion | Wolf
type herbivore = Wildebeest | Bisonlet eats predator prey =
any_to_string predator^" eats "^any_to_string preyI think it would be a good exercise to work out which OO design patterns correspond to which functional programming constructs and translate the examples accordingly.
First of all, I want do undestand how can I write in F# like in C# OO style, next step to simplify it with functional programming features.
I don't understand how use the Predator example?
Don't forget that most object-oriented design patterns are redundant in a functional programming language like F#.
For example, the (incomplete!) hundred line example for the "abstract factory pattern" by the GoF translates into four lines of F#:
1 2 3 4 5type carnivore = Lion | Wolf type herbivore = Wildebeest | Bison let eats predator prey = any_to_string predator^" eats "^any_to_string preyI think it would be a good exercise to work out which OO design patterns correspond to which functional programming constructs and translate the examples accordingly.
First of all, I want do undestand how can I write in F# like in C# OO style, next step to simplify it with functional programming features.
I don't understand how use the Predator example?
I think what Jon means is that there are some patterns in OO programing that aren't actually patterns in a functional language like F# as they are either a feature of the langauge or they can be encapsulated by a single library function. Take the iterator pattern for example ([link:en.wikipedia.org]), now reduntant in many languages, not just functional ones. In F# this can be replaced by a single call to Seq.iter or use the build it list comprehensions (for x in list do ...).
So the challenge is not to wirte F# like C# OO then simplify it, but go though existing design patterns and say that pattern can be replace by XXX feature or F# or this pattern can be replaced a call to the function YYY. I think this is a fairly changeling task requiring you to know both design patterns and F# very well, also I don't think you'll be able to do this for every pattern, but I think that there is some where you can.
Jon predator example is simple to use:
1
eats Lion Wildebeest
I'm not that famillar with the "Abstract Factory Pattern", but I think the point he is trying to make is that the "abstract factory pattern" resembles F#'s union types.
1eats Lion WildebeestI'm not that famillar with the "Abstract Factory Pattern", but I think the point he is trying to make is that the "abstract factory pattern" resembles F#'s union types.
But how use union types than it become the Abstract Factory Pattern? I think without inheritance it's imposible.
Thanks for sharing! This is a very interesting work! OCaml is very close to F#, so it is definetly useful, but I still think that in F# it is sometimes benefitial to use some of the F# "object oriented" constructs, however it has to be carefuly evaluated when it makes sense.
Saddly, functors (used for abstract factory) are one of the OCaml constructs that are not available in F#. You can write similar code be generalizing the code I posted earlier.
I think it would be a good exercise to work out which OO design patterns correspond to which functional programming constructs and translate the examples accordingly.
This is true, and I'd say that functional programing has its own set of design patterns as well. For example a common pattern I see is the use of an auxiliary function to with an accumilator parameter that is then hidden from the functions users. For example this definition of the library function rev_map:
1 2 3 4 5 6 7
#light let rev_map f l = let rec rev_map_acc f l acc = match l with | [] -> acc | h::t -> rev_map_acc f t (f h :: acc) rev_map_acc f l []
There's probably others out there, but thats the only one I can think of off the top of my head. I know there has been some academic work in this area: [link:www.cs.vu.nl], but personally I don't find this paper very easy reading. It would certainly to see OO design patterns mapped to F# constructs along with a set of design patterns in F#. But I think this would be difficult task.
One problem
1) override x.Display depth = Console.WriteLine(new String('-', depth) + x.Name)
Than get name field Component class, I create property Name. Can I do something than field name be available in child class?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
--------------------------- Composite -------------------------------------------- open System type Component(s: string) = class let mutable name = s member x.Name with get() = name and set(v) = name <- v abstract Add: Component -> unit abstract Remove: Component -> unit abstract Display: int -> unit end type Composite(s: string) = class inherit Component(s) let mutable children = [] override x.Add com = children <- children @ [com] override x.Remove com = children <- List.filter (fun c -> c <> com) children override x.Display depth = Console.WriteLine(new String('-', depth) + x.Name) List.iter (fun (com : Component) -> com.Display(depth + 2)) children end type Leaf(s) = class inherit Component(s) override x.Add com = Console.WriteLine("Cannot add to a leaf") override x.Remove com = Console.WriteLine("Cannot remove from a leaf") override x.Display depth = Console.WriteLine(new String('-', depth) + x.Name) end open Composite let root = new Composite("root"); root.Add(new Leaf("Leaf A")); root.Add(new Leaf("Leaf B")); let comp = new Composite("Composite X"); comp.Add(new Leaf("Leaf XA")); comp.Add(new Leaf("Leaf XB")); root.Add(comp); root.Add(new Leaf("Leaf C")); // Add and remove a leaf let leaf = new Leaf("Leaf D"); root.Remove(leaf); // Recursively display tree root.Display(1);
2) If replace
for com in children do com.Display(depth + 2) done
on
List.map (fun com -> com.Display(depth + 2)) children
Function signature change to
int -> a' list
What do I set in end of function, than it become int -> unit ?
When you need to explicitely ignore a value, just call the "ignore" ('a -> unit) function. Here you don't need it: the map function creates a new map. If you just want to iterate over a list, use List.iter ('a list -> unit).
For F# code highliting in the forum, I've got a button for that in design mode (but I think it depends on your options - I don't know where I got it).
In both Design and HTML mode, you can also try this tag: [ code language="F#"] let id x = x </code>
just call the "ignore" ('a -> unit) function.
I don't understand want it means. Can you write the code?
I don't understand want it means. Can you write the code?
1
List.map (fun com -> com.Display(depth + 2))
returns a List.
1
ignore (List.map (fun com -> com.Display(depth + 2)))
calls the List.map function and ignores return value
1
List.map (fun com -> com.Display(depth + 2)) |> ignore
the same
1
List.iter (fun com -> com.Display(depth + 2))
the same, but prettier
Laurent.
First you need to use Internet Explorer to get code highlights, than simply copy paste from Visual Studio.
For getting base class try to reference it by base alias
1 2 3 4 5 6 7 8
type Composite(s: string) = class inherit Component(s) as base let mutable children = [] override x.Add com = children <- children @ [com] override x.Remove com = children <- List.filter (fun c -> c <> com) children override x.Display depth = Console.WriteLine(new String('-', depth) + base.Name) for com in children do com.Display(depth + 2) done end
For your second question this is because of type inference. You can read more from this thread
Hope this helps.
Can.
For getting base class try to reference it by base alias
type Composite(s: string) = class
inherit Component(s) as base
let mutable children = []
override x.Add com = children <- children @ [com]
override x.Remove com = children <- List.filter (fun c -> c <> com) children
override x.Display depth = Console.WriteLine(new String('-', depth) + base.Name)
for com in children do com.Display(depth + 2) done
end
I don't want create the
1 2 3 4 5 6 7
member x.Name with get() = name and set(v) = name <- v
and I wand get access to parent field like base.name but it is not available.
For getting base class try to reference it by base alias
type Composite(s: string) = class
inherit Component(s) as base
let mutable children = []
override x.Add com = children <- children @ [com]
override x.Remove com = children <- List.filter (fun c -> c <> com) children
override x.Display depth = Console.WriteLine(new String('-', depth) + base.Name)
for com in children do com.Display(depth + 2) done
endI don't want create the
1 2 3member x.Name with get() = name and set(v) = name <- vand I wand get access to parent field like base.name but it is not available.
Could you please try to read red highlighted code.
Could you please try to read red highlighted code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
type Component(s: string) = class let mutable name = s abstract Add: Component -> unit abstract Remove: Component -> unit abstract Display: int -> unit end type Composite(s: string) = class inherit Component(s) as base let mutable children = [] override x.Add com = children <- children @ [com] override x.Remove com = children <- List.filter (fun c -> c <> com) children override x.Display depth = Console.WriteLine(new String('-', depth) + base.Name) for com in children do com.Display(depth + 2) done end
Error 1 The field, constructor or member 'Name' is not defined.
What am I doing wrong?
As Tomas said, your base class does not have Name member to override. let mutable name is a private field. Here is the base class implementation (same as you did previously, don't know why you've removed name member)
type Component(s: string) = class
let mutable name = s
member x.Name
with get() = name
and set(v) = name <- v
abstract Add: Component -> unit
abstract Remove: Component -> unit
abstract Display: int -> unit
end
don't know why you've removed name member
In other words I want to have protected member name, but I see it's imposible.
It is possible : declare a member as any oher, but remove it from he signature file. The issue is that you can then only inherit this member from within the said file (ie not from an external one).
1 2 3 4 5 6 7 8
//file.fsi type foo = class new: unit -> foo end type bar = class new: unit -> bar end //file.fs type foo () = class member x.run() = print_string "foo()" end type bar () = class inherit foo as base override x.run() = (base.run(); print_string "\n----\n bar()!") end
An alternate approach is to use an explicit constructor:
type Component = class
val mutable Name : string
new(s) = { Name = s; }
abstract Add : Component -> unit
// rest of abstracts
end
Hi,
The problem with this example is that the Component type doesn't expose the name publicly (local values declared using "let" are private). To fix it just add the following line to the component:
member x.Name = name
However, I would probably use slightly different way for writing this in F# (it is not a criticism, just a comment how I personally would do it, because there are only a few established design patterns that you could follow).
First, I don't understand why there are "Add" and "Remove" methods in the Component - I think these should be only in the Composite type. In F# you can write function that takes sequence (list or array) of components and returns component that behaves like composite without writing the Composite type explicitly. This is very easy to write, so you might prefer this way:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
open System type IComponent = interface abstract Display : int -> unit end let compose (children:seq<IComponent>) = { new IComponent with Display(depth) = Console.WriteLine(new String('-', depth) + "Composite component") for c in children do c.Display(depth+2) }<BR< P> // to use it you can write: let cm = compose [ component1; component2; component3; ]
You can find some more information about the syntax I used at the end of this page: [link:research.microsoft.com]
Good job ais.
My suggestion will be to use inline class definition to make the code more readable. For instance :
1 2 3 4 5 6 7 8 9 10 11
type Client = class val mutable abstractProductA: AbstractProductA val mutable abstractProductB: AbstractProductB new(fac: AbstractFactory) = {abstractProductA = fac.CreateProductA(); abstractProductB = fac.CreateProductB()} member x.Run = x.abstractProductB.Interact(x.abstractProductA) end type Client (fac: AbstractFactory) = class let mutable abstractProductA = fac.CreateProductA() let mutable abstractProductB = fac.CreateProductB() member this.Run = abstractProductB.Interact(abstractProductA) end
Both of the definitions are identical, but I think the second one is easy to read and write.It's not an issue it's just the coding style. For the bridge pattern you made a little mistake while assigning implementor property.Since it's a mutable variable you need to assign using mutable operator (<-) ab.Implementor <- Some(new ConcreteImplementorA():> Implementor)ab.Operation() ab.Implementor <- Some(new ConcreteImplementorB():> Implementor)ab.Operation() Hope this helps.Can.</code>
Big thanks, your Client class really look better.
One question, how can I hightlight the code?
Topic tags
- f# × 3705
- websharper × 1897
- compiler × 286
- functional × 201
- ui next × 139
- c# × 121
- classes × 97
- web × 97
- .net × 84
- book × 84
- async × 76
- ui.next × 67
- bug × 54
- core × 49
- website × 49
- server × 45
- parallel × 43
- ui × 43
- enhancement × 41
- parsing × 41
- testing × 41
- trywebsharper × 41
- typescript × 37
- html × 35
- javascript × 35
- owin × 35
- asynchronous × 30
- monad × 28
- ocaml × 28
- tutorial × 27
- warp × 27
- haskell × 26
- sitelet × 25
- linq × 22
- workflows × 22
- wpf × 20
- fpish × 19
- introduction × 19
- silverlight × 19
- sitelets × 19
- monodevelop × 17
- rpc × 17
- suave × 17
- piglets × 16
- collections × 15
- feature request × 15
- jquery × 15
- templates × 15
- getting started × 14
- pipeline × 14
- kendoui × 13
- reactive × 12
- 4.1.0.171 × 11
- monads × 11
- opinion × 10
- 4.0.190.100-rc × 9
- deployment × 9
- fixed × 9
- formlets × 9
- in × 9
- json × 9
- plugin × 9
- proposal × 9
- scheme × 9
- solid × 9
- basics × 8
- concurrent × 8
- highcharts × 8
- how-to × 8
- python × 8
- 4.1.1.175 × 7
- complexity × 7
- documentation × 7
- visual studio × 7
- 4.1.2.178 × 6
- lisp × 6
- real-world × 6
- released in 4.0.192.103-rc × 6
- remoting × 6
- resources × 6
- scala × 6
- websharper ui.next × 6
- workshop × 6
- xaml × 6
- 4.0.193.110 × 5
- 4.2.3.236 × 5
- aspnetmvc × 5
- authentication × 5
- azure × 5
- bootstrap × 5
- conference × 5
- dsl × 5
- formlet × 5
- java × 5
- list × 5
- metaprogramming × 5
- ml × 5
- released in Zafir.4.0.188.91-beta10 × 5
- sql × 5
- visualstudio × 5
- websharper.forms × 5
- zafir × 5
- 4.0.192.106 × 4
- 4.0.195.127 × 4
- 4.1.0.38 × 4
- 4.2.1.86 × 4
- 4.2.6.118 × 4
- css × 4
- example × 4
- extensions × 4
- fsi × 4
- fsx × 4
- html5 × 4
- jqueryui × 4
- lift × 4
- reflection × 4
- remote × 4
- rest × 4
- spa × 4
- teaching × 4
- template × 4
- websocket × 4
- wontfix × 4
- 4.0.196.147 × 3
- 4.1.0.34 × 3
- 4.1.6.207 × 3
- 4.2.1.223-beta × 3
- 4.2.11.258 × 3
- 4.2.4.114 × 3
- 4.2.4.247 × 3
- 4.2.5.115 × 3
- 4.2.6.253 × 3
- 4.2.9.256 × 3
- ajax × 3
- alt.net × 3
- aml × 3
- asp.net mvc × 3
- canvas × 3
- cloudsharper × 3
- compilation × 3
- database × 3
- erlang × 3
- events × 3
- extension × 3
- file upload × 3
- forums × 3
- inline × 3
- issue × 3
- kendo × 3
- macro × 3
- mono × 3
- msbuild × 3
- mvc × 3
- pattern × 3
- piglet × 3
- released in Zafir.4.0.187.90-beta10 × 3
- svg × 3
- type provider × 3
- view × 3
- 4.1.1.64 × 2
- 4.1.5.203 × 2
- 4.1.7.232 × 2
- 4.2.10.257 × 2
- 4.2.3.111 × 2
- 4.2.5.249 × 2
- android × 2
- asp.net × 2
- beginner × 2
- blog × 2
- chart × 2
- client × 2
- client server app × 2
- clojure × 2
- computation expressions × 2
- constructor × 2
- corporate × 2
- courses × 2
- cufp × 2
- d3 × 2
- debugging × 2
- direct × 2
- discriminated union × 2
- docs × 2
- elm × 2
- endpoint × 2
- endpoints × 2
- enterprise × 2
- entity framework × 2
- event × 2
- f# interactive × 2
- fable × 2
- flowlet × 2
- formdata × 2
- forms × 2
- fsc × 2
- google maps × 2
- hosting × 2
- http × 2
- https × 2
- iis 8.0 × 2
- install × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- jquery mobile × 2
- keynote × 2
- lens × 2
- lenses × 2
- linux × 2
- listmodel × 2
- mac × 2
- numeric × 2
- oauth × 2
- obfuscation × 2
- offline × 2
- oop × 2
- osx × 2
- packaging × 2
- pattern matching × 2
- performance × 2
- pipelines × 2
- q&a × 2
- quotation × 2
- reference × 2
- released in Zafir.4.0.185.88-beta10 × 2
- rx × 2
- script × 2
- security × 2
- self host × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- tutorials × 2
- type × 2
- url × 2
- var × 2
- websharper.charting × 2
- websharper4 × 2
- websockets × 2
- wig × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- 4.0.194.126 × 1
- 4.1.3.184 × 1
- 4.1.4.189 × 1
- 4.2.0.214-beta × 1
- 4.2.12.259 × 1
- 4.2.2.231-beta × 1
- 4.2.8.255 × 1
- Canvas Sample Example × 1
- DynamicStyle Animated Style × 1
- Fixed in 4.0.190.100-rc × 1
- Released in Zafir.UI.Next.4.0.169.79-beta10 × 1
- SvgDynamicAttribute × 1
- WebComponent × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- actor × 1
- addin × 1
- agents × 1
- aggregation × 1
- agile × 1
- alter session × 1
- animation × 1
- anonymous object × 1
- apache × 1
- api × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net core × 1
- asp.net integration × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- attributes × 1
- authorization × 1
- b-tree × 1
- back button × 1
- badimageformatexception × 1
- bash script × 1
- batching × 1
- binding-vars × 1
- bistro × 1
- body × 1
- bundle × 1
- camtasia studio × 1
- cas protocol × 1
- charts × 1
- clarity × 1
- class × 1
- cli × 1
- clipboard × 1
- clojurescript × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- color zones × 1
- combinator × 1
- combinators × 1
- compile × 1
- compile code on server × 1
- config × 1
- confirm × 1
- content × 1
- context × 1
- context.usersession × 1
- continuation-passing style × 1
- coords × 1
- cordova × 1
- cors × 1
- coursera × 1
- cross-domain × 1
- csla × 1
- current_schema × 1
- custom content × 1
- data × 1
- data grid × 1
- datetime × 1
- debug × 1
- declarative × 1
- delete × 1
- devexpress × 1
- dhtmlx × 1
- dictionary × 1
- directattribute × 1
- disqus × 1
- distance × 1
- do binding × 1
- doc elt ui.next upgrade × 1
- docker × 1
- dojo × 1
- dol × 1
- dom × 1
- domain × 1
- du × 1
- duf-101 × 1
- dynamic × 1
- eastern language × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- enums × 1
- error × 1
- etw × 1
- euclidean × 1
- eventhandlerlist × 1
- examples × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- failed to translate × 1
- fake × 1
- fantomas × 1
- fear × 1
- float × 1
- form × 1
- form-data × 1
- forum × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- fsunit × 1
- function × 1
- functional style × 1
- game × 1
- games × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- getting-started × 1
- google × 1
- google.maps × 1
- grid × 1
- group × 1
- guide × 1
- hash × 1
- headers × 1
- hello world example × 1
- heroku × 1
- highchart × 1
- history × 1
- how to × 1
- html-templating × 1
- http405 × 1
- httpcontext × 1
- hubfs × 1
- i18n × 1
- ie 8 × 1
- if-doc × 1
- iis × 1
- image × 1
- images × 1
- inheritance × 1
- initialize × 1
- input × 1
- install "visual studio" × 1
- installer × 1
- int64 × 1
- interfaces × 1
- internet explorer × 1
- interop × 1
- interpreter × 1
- io × 1
- iobservable × 1
- ios × 1
- iot × 1
- ipad × 1
- isomorphic × 1
- javascript optimization × 1
- javascript semanticui resources × 1
- jquery-plugin × 1
- jquery-ui × 1
- jquery-ui-datepicker × 1
- js × 1
- kendo datasource × 1
- kendochart × 1
- kendoui compiler × 1
- knockout × 1
- l10n × 1
- learning × 1
- library × 1
- libs × 1
- license × 1
- licensing × 1
- lineserieszonescfg × 1
- local setting × 1
- localization × 1
- logging × 1
- loop × 1
- macros × 1
- mailboxprocessor × 1
- mapping × 1
- maps × 1
- markerclusterer × 1
- markup × 1
- marshal × 1
- math × 1
- mathjax × 1
- message × 1
- message passing × 1
- message-passing × 1
- meta × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- mix × 1
- mobile installation × 1
- mod_mono × 1
- modal × 1
- module × 1
- mouseevent × 1
- mouseposition × 1
- multidimensional × 1
- multiline × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- native × 1
- nested × 1
- nested loops × 1
- node × 1
- nunit × 1
- object relation mapper × 1
- object-oriented × 1
- om × 1
- onboarding × 1
- onclick × 1
- optimization × 1
- option × 1
- orm × 1
- os x × 1
- output-path × 1
- override × 1
- paper × 1
- parameter × 1
- persistence × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- post × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- privacy × 1
- private × 1
- profile × 1
- programming × 1
- project × 1
- project euler × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- proxy × 1
- ptvs × 1
- public × 1
- pure f# × 1
- purescript × 1
- qna × 1
- quant × 1
- query sitelet × 1
- question × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- reactjs × 1
- real-time × 1
- ref × 1
- region × 1
- released in 4.0.190.100-rc × 1
- reporting × 1
- responsive design × 1
- rest api × 1
- rest sitelet × 1
- restful × 1
- round table × 1
- router × 1
- routing × 1
- rpc reverseproxy × 1
- runtime × 1
- sales × 1
- sample × 1
- sampleapp × 1
- scriptcs × 1
- scripting × 1
- search × 1
- self hosted × 1
- semanticui × 1
- sequence × 1
- serialisation × 1
- service × 1
- session-state × 1
- sharepoint × 1
- signals × 1
- sitelet website × 1
- sitelet.protect × 1
- sitlets × 1
- slickgrid × 1
- source code × 1
- sqlentityconnection × 1
- ssl × 1
- standards × 1
- static content × 1
- stickynotes × 1
- streamreader × 1
- stress × 1
- strong name × 1
- structures × 1
- submitbutton × 1
- subscribe × 1
- svg example html5 websharper.ui.next × 1
- sweetalert × 1
- system.datetime × 1
- system.reflection.targetinvocationexception × 1
- table storage × 1
- targets × 1
- tdd × 1
- templates ui.next × 1
- templating × 1
- text parsing × 1
- three.js × 1
- time travel × 1
- tls × 1
- tooltip × 1
- tracing × 1
- tsunamiide × 1
- turkish × 1
- twitter-bootstrap × 1
- type erasure × 1
- type inference × 1
- type providers × 1
- type-providers × 1
- typeprovider × 1
- ui next forms × 1
- ui-next × 1
- ui.next jqueryui × 1
- ui.next charting × 1
- ui.next formlets × 1
- ui.next forms × 1
- ui.next suave visualstudio × 1
- ui.next templating × 1
- unicode × 1
- unittest client × 1
- upload × 1
- usersession × 1
- validation × 1
- vb × 1
- vb.net × 1
- vector × 1
- view.map × 1
- visal studio × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio shell × 1
- vs2017 compiler zafir × 1
- vsix × 1
- web api × 1
- web-scraping × 1
- webapi × 1
- webcomponents × 1
- webforms × 1
- webgl × 1
- webrtc × 1
- webshaper × 1
- websharper async × 1
- websharper codemirror × 1
- websharper f# google × 1
- websharper forms × 1
- websharper reactive × 1
- websharper rpc × 1
- websharper sitelets routing × 1
- websharper warp × 1
- websharper-interface-generator × 1
- websharper.chartsjs × 1
- websharper.com × 1
- websharper.exe × 1
- websharper.owin × 1
- websharper.ui.next × 1
- websharper.ui.next jquery × 1
- websockets iis × 1
- why-websharper × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- www.grabbitmedia.com × 1
- xamarin × 1
- xml × 1
- yeoman × 1
- yield × 1
- zafir beta × 1
- zafir websharper4 × 1
- zarovizsga × 1
![]() |
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy |
Built with WebSharper |
I am trying to rewrite some patterns from C# [link:dofactory.com] to F#
May be somebody tell me how I can simplify something.