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
endFor 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 <- vand 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
endError 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)
endBoth 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# × 3707
- websharper × 2884
- core × 418
- bolero × 329
- compiler × 291
- enhancement × 215
- functional × 201
- bug × 177
- ui next × 140
- ui × 132
- c# × 122
- classes × 97
- web × 97
- .net × 84
- book × 84
- async × 77
- ui.next × 67
- templates × 58
- website × 51
- trywebsharper × 50
- question × 46
- html × 45
- server × 45
- owin × 44
- javascript × 43
- parallel × 43
- parsing × 41
- testing × 41
- typescript × 39
- template × 38
- sitelet × 31
- asynchronous × 30
- feature request × 28
- monad × 28
- ocaml × 28
- warp × 28
- tutorial × 27
- haskell × 26
- dotnet-ws × 23
- linq × 22
- sitelets × 22
- workflows × 22
- rpc × 21
- getting started × 20
- wpf × 20
- fpish × 19
- introduction × 19
- silverlight × 19
- monodevelop × 17
- piglets × 17
- suave × 17
- docs × 16
- collections × 15
- jquery × 15
- proposal × 15
- aspnetcore × 14
- pipeline × 14
- reactive × 14
- 4.6.0.361 × 13
- documentation × 13
- kendoui × 13
- formlets × 12
- 4.1.0.171 × 11
- monads × 11
- released: v0.1 × 11
- websocket × 11
- 4.4.0.280 × 10
- 4.4.1.288 × 10
- opinion × 10
- tryfsharponwasm × 10
- 4.0.190.100-rc × 9
- deployment × 9
- fixed × 9
- in × 9
- json × 9
- plugin × 9
- scheme × 9
- solid × 9
- wontfix × 9
- 4.3.0.274 × 8
- 4.5.4.317 × 8
- basics × 8
- concurrent × 8
- highcharts × 8
- how-to × 8
- mvu × 8
- python × 8
- released: v0.11 × 8
- 4.1.1.175 × 7
- 4.5.1.304 × 7
- complexity × 7
- remoting × 7
- visual studio × 7
- 4.1.2.178 × 6
- 4.5.4.151 × 6
- authentication × 6
- datefns × 6
- lisp × 6
- real-world × 6
- released in 4.0.192.103-rc × 6
- resources × 6
- scala × 6
- websharper ui.next × 6
- workshop × 6
- xaml × 6
- 4.0.193.110 × 5
- 4.2.11.258 × 5
- 4.2.3.236 × 5
- aspnetmvc × 5
- azure × 5
- bootstrap × 5
- conference × 5
- css × 5
- dsl × 5
- formlet × 5
- java × 5
- list × 5
- metaprogramming × 5
- ml × 5
- q&a × 5
- released in Zafir.4.0.188.91-beta10 × 5
- released: v0.4 × 5
- released: v0.8 × 5
- spa × 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.13.263 × 4
- 4.2.6.118 × 4
- 4.5.5.155 × 4
- 4.6.4.404 × 4
- discussion × 4
- example × 4
- extension × 4
- extensions × 4
- fsi × 4
- fsx × 4
- help wanted × 4
- highlightjs × 4
- html5 × 4
- jqueryui × 4
- lift × 4
- performance × 4
- qna × 4
- react × 4
- reflection × 4
- released: v0.10 × 4
- released: v0.5 × 4
- remote × 4
- rest × 4
- teaching × 4
- todomvc × 4
- 4.0.196.147 × 3
- 4.1.0.34 × 3
- 4.1.6.207 × 3
- 4.2.1.223-beta × 3
- 4.2.14.264 × 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
- 4.5.0.140 × 3
- 4.5.0.290 × 3
- 4.5.18.348 × 3
- 4.5.2.309 × 3
- 4.5.8.327 × 3
- 4.6.2.386 × 3
- ajax × 3
- alt.net × 3
- aml × 3
- asp.net mvc × 3
- build × 3
- canvas × 3
- cloudsharper × 3
- compilation × 3
- d3 × 3
- data × 3
- database × 3
- erlang × 3
- events × 3
- file upload × 3
- forums × 3
- how to × 3
- http × 3
- inline × 3
- issue × 3
- kendo × 3
- macro × 3
- materialui × 3
- mono × 3
- msbuild × 3
- mvc × 3
- pattern × 3
- piglet × 3
- released in Zafir.4.0.187.90-beta10 × 3
- released: v0.12 × 3
- released: v0.9 × 3
- svg × 3
- type provider × 3
- view × 3
- websharper4 × 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
- 4.3.0.127 × 2
- 4.3.1.275 × 2
- 4.5.10.166 × 2
- 4.5.10.332 × 2
- 4.5.15.342 × 2
- 4.5.19.349 × 2
- 4.5.3.146 × 2
- 4.5.9.301 × 2
- android × 2
- api × 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
- debugging × 2
- direct × 2
- discriminated union × 2
- dom × 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
- fsharp × 2
- google × 2
- google maps × 2
- hosting × 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
- maps × 2
- numeric × 2
- oauth × 2
- obfuscation × 2
- offline × 2
- oop × 2
- osx × 2
- packaging × 2
- pattern matching × 2
- pipelines × 2
- post × 2
- quotation × 2
- reference × 2
- released in Zafir.4.0.185.88-beta10 × 2
- released: v0.13 × 2
- released: v0.6 × 2
- remarkable × 2
- rx × 2
- script × 2
- security × 2
- self host × 2
- seq × 2
- sockets × 2
- stm × 2
- sweetalert × 2
- tcp × 2
- trie × 2
- tutorials × 2
- type × 2
- url × 2
- var × 2
- websharper.charting × 2
- websockets × 2
- wig × 2
- xna × 2
- zh × 2
- .net framework × 1
- .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
- 4.4.1.137 × 1
- 4.5.1.141 × 1
- 4.5.11.334 × 1
- 4.5.12.177 × 1
- 4.5.13.318 × 1
- 4.5.13.338 × 1
- 4.5.16.344 × 1
- 4.5.2.145 × 1
- 4.5.3.144 × 1
- 4.5.3.310 × 1
- 4.5.5.319 × 1
- 4.5.6.156 × 1
- 4.5.6.320 × 1
- 4.5.7.322 × 1
- 4.5.8.161 × 1
- 4.5.9.164 × 1
- 4.6.1.127 × 1
- 4.6.1.381 × 1
- 4.6.3.388 × 1
- 4.6.5.406 × 1
- 4.6.6.407 × 1
- Canvas Sample Example × 1
- DynamicStyle Animated Style × 1
- ES8 × 1
- Fixed in 4.0.190.100-rc × 1
- Metro-Ui-Css × 1
- Metro4 × 1
- Released in Zafir.UI.Next.4.0.169.79-beta10 × 1
- SvgDynamicAttribute × 1
- Swiper × 1
- WebComponent × 1
- WebSharper.TypeScript × 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
- 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
- code-review × 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 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
- domain × 1
- dotnet core × 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
- extjs × 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.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
- good first issue × 1
- google visualization timeline × 1
- google.maps × 1
- grid × 1
- group × 1
- guide × 1
- hash × 1
- headers × 1
- hello world example × 1
- heroku × 1
- highchart × 1
- history × 1
- html-templating × 1
- http405 × 1
- httpcontext × 1
- hubfs × 1
- i18n × 1
- ide × 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
- invalid × 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
- jquerymobile × 1
- js × 1
- kendo datasource × 1
- kendochart × 1
- kendoui compiler × 1
- knockout × 1
- l10n × 1
- leaflet × 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
- markerclusterer × 1
- markup × 1
- marshal × 1
- math × 1
- mathjax × 1
- message × 1
- message passing × 1
- message-passing × 1
- meta × 1
- metro style × 1
- metro-ui × 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
- netstandard × 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
- plotly × 1
- pola × 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
- quant × 1
- query sitelet × 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
- released: v0.2 × 1
- released: v0.3 × 1
- released: v0.7 × 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
- system.datetime × 1
- system.reflection.targetinvocationexception × 1
- table storage × 1
- targets × 1
- tdd × 1
- template ClientServer × 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
- up for grabs × 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 code × 1
- visual studio shell × 1
- visualstudio-websharper × 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
- webspeech × 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.
------------------------- Abstractfactory --------------------------------- #light open System type AbstractProductA() = class end type AbstractProductB() = class abstract Interact : AbstractProductA -> unit end type ProductA1 = class inherit AbstractProductA new() = {} end type ProductA2 = class inherit AbstractProductA new() = {} end type ProductB1 = class inherit AbstractProductB override x.Interact(a) = Console.WriteLine("ProductB1 interacts with " + a.GetType().ToString()) new() = {} end type ProductB2 = class inherit AbstractProductB override x.Interact(a) = Console.WriteLine("ProductB2 interacts with " + a.GetType().ToString()) new() = {} end type AbstractFactory = class abstract CreateProductA : unit -> AbstractProductA abstract CreateProductB : unit -> AbstractProductB new() = {} end type ConcreteFactory1 = class inherit AbstractFactory override x.CreateProductA() = (new ProductA1():> AbstractProductA) override x.CreateProductB() = (new ProductB1():> AbstractProductB) new() = {} end type ConcreteFactory2 = class inherit AbstractFactory override x.CreateProductA() = (new ProductA2():> AbstractProductA) override x.CreateProductB() = (new ProductB2():> AbstractProductB) new() = {} end type Client(fac: AbstractFactory) = class let mutable abstractProductA = fac.CreateProductA() let mutable abstractProductB = fac.CreateProductB() member x.Run = abstractProductB.Interact(abstractProductA) end open Abstractfactory // Abstract factory #1 let factory1 = new ConcreteFactory1(); let c1 = new Client(factory1); c1.Run // Abstract factory #2 let factory2 = new ConcreteFactory2(); let c2 = new Client(factory2); c2.Run; ------------------ Builder ---------------- #light open System type Product = class val mutable parts: string list member x.Add s = x.parts <- x.parts @ [ s ] member x.Show() = Console.WriteLine("\nProduct Parts -------") List.map (fun s -> Console.WriteLine(s: string)) x.parts new() = {parts = []} end type Builder = class val product : Product abstract BuildPartA : unit -> unit abstract BuildPartB : unit -> unit abstract GetResult : unit -> Product new() = {product = new Product()} end type ConcreteBuilder1 = class inherit Builder override x.BuildPartA() = x.product.Add "PartA" override x.BuildPartB() = x.product.Add "PartB" override x.GetResult() = x.product new() = {} end type ConcreteBuilder2 = class inherit Builder override x.BuildPartA() = x.product.Add "PartX" override x.BuildPartB() = x.product.Add "PartY" override x.GetResult() = x.product new() = {} end type Director = class member x.Construct (builder:Builder) = builder.BuildPartA() builder.BuildPartB() new() = {} end open Builder; // Create director and builders let director = new Director(); let b1 = new ConcreteBuilder1(); let b2 = new ConcreteBuilder2(); // Construct two products director.Construct(b1) let p1 = b1.GetResult() p1.Show() director.Construct(b2) let p2 = b2.GetResult() p2.Show() ---------------------- Factory Method ------------------------- #light type Product() = class end type ConcreteProductA = class inherit Product new() = {} end type ConcreteProductB = class inherit Product new() = {} end type ICreator = interface abstract FactoryMethod : unit -> Product end type ConcreteCreatorA = class new() = {} interface ICreator with member x.FactoryMethod() = (new ConcreteProductA():>Product) end end type ConcreteCreatorB = class new() = {} interface ICreator with member x.FactoryMethod() = (new ConcreteProductB():>Product) end end open FactoryMethod let creators = [(new ConcreteCreatorA():> ICreator);(new ConcreteCreatorB():> ICreator)] let Create = creators |> List.map (fun (creator : ICreator) -> creator.FactoryMethod()) |> List.map (fun product -> Console.WriteLine("Created {0}",product.GetType().Name)) ------------------ Adapter ------------ #light open System type Target = class abstract Request: unit -> unit new() = {} default x.Request() = Console.WriteLine("Called Target Request()") end type Adaptee = class member x.SpecificRequest() = Console.WriteLine("Called SpecificRequest()") new() = {} end type Adapter = class inherit Target val adaptee: Adaptee new() = {adaptee = new Adaptee()} override x.Request() = x.adaptee.SpecificRequest() end // Create adapter and place a request open Adapter let target = new Adapter(); target.Request() ------ Bridge ----- #light open System type Implementor() = class abstract Operation: unit -> unit end type ConcreteImplementorA = class inherit Implementor new() = {} override x.Operation() = Console.WriteLine("ConcreteImplementorA Operation") end type ConcreteImplementorB = class inherit Implementor new() = {} override x.Operation() = Console.WriteLine("ConcreteImplementorB Operation") end type Abstraction() = class let mutable implementor : Implementor option = None member x.Implementor with get() = implementor and set(v) = implementor <- v abstract Operation: unit -> unit default x.Operation() = match implementor with | None -> failwith "None" | Some a -> a.Operation() end type RefinedAbstraction = class inherit Abstraction as base new() = {} override x.Operation() = match base.Implementor with | None -> failwith "None" | Some a -> a.Operation() end open Bridge; let ab = new RefinedAbstraction() // Set implementation and call ab.Implementor <- Some(new ConcreteImplementorA():> Implementor) ab.Operation() // Change implemention and call ab.Implementor <- Some(new ConcreteImplementorB():> Implementor) ab.Operation()