Let me add my 2 cents worth.
I think that if all you are looking for is a better (easier, lighter, whatever ) syntax for exactly the same thing you are so used to doing in C# - you are missing the point. In this thread people made some wonderful points in regards to how much easier the same constructs can be expressed in F# as opposed to C#, but there is so much more...
If you stay on this level you will be stuck in the little endian - big endian war about what it is better
1
List.fold (+) 0 list
or
1
foreach int item in list total += item
To really get from F# what it can do for you you have to change the way you think, design, write your code. There are many books and articles which can explain this much better than I can, so I will not even try - at least not here.
But one thing which I find most facinating and ecouraging is that while it will take more time and effort (at least in the beginning) to take your project from the idea to the compiled code, after you have compiled code you are much closer to the end result. It is not that the debugger is better - it is terrible - but somehow you need much less debugging. It's like thinking functionally forces you closer to the working code.
At least this is what I and my developers feel based on our very limited so far experience with F#
Regarding the implicit mutability of .NET types, such as arrays, I initially shared Ivan Krivyakov's surprise that the following example is actually a mutable type.
1
type Record = { data : int array; }
However, that really does not keep me awake at night. F# does give you all the tools you need to manipulate arrays in a functional way in the Array module. F# does not force mutability on the programmer. Maybe that's a problem, but that's a design decision with which I'm OK.
Ivan also complains that F# lacks functional arrays. I'm not sure what functional arrays are, but after some quick search on google (see e.g. [link:citeseerx.ist.psu.edu]), I wonder if Map<int, 'a> wouldn't do the trick? They seem to have the same performance as far as random accesses are concerned.
Just one quick point about arrays - the record above is indeed mutable type, but that doesn't say anything about how you're using it. Let's say you write some processing function:
1 2 3 4 5
type Record = { data : int array; } let process recd = { data = recd.data |> Array.map (fun n -> n + 1) }
... this of course doesn't modify the existing value and if you hide implementation details of the Record type and the process function (e.g. in a module) and write the code using Record just using the process function, you'll end up with perfectly functional code, with the only difference that it'll be faster in some cases. I think this pretty much demonstrates the general F# approach - F# allows you to break the rules, but that's partly why it's successful - because you sometimes need to do that (at least when programming real-world .NET applications).
It would be probably nicer to have a wrapper for array that wouldn't allow modifying the underlying array, so that you could still write the code above without worrying whether you're not accidentaly modifying the array somewhere... for simple cases, that's probably unnecessary, but it would be good to have it.
>> c# and F# will be learned from each other. and therefore, most featuers
in f# will be
>> gruadually implemented in c# and vice versa.
There is some truth in that, but it's like saying that designers of fighter jets and civilian airliners learn from each other. Sure they do, but a fighter jet will never be a civilian airliner, or vice-versa.
>> . What is the future of F#?no one knows, because F# is nothing special to c# if you
>> consider it carefully and deeply.
I could give you a list of major differences between F# and C#, but it won't be convincing unless you've actually used them. Once you've written a lot of code using pattern matching, curry functions, type inference (not just the C# "var" version), the |> operator, etc, you will, hopefully, become convinced that F# is a very different language, and very much worth knowing.
Well, it's a wierd, mis-informed article. From the get go, sure, any language that supports higher order functions can be called functional. However, actually being able to practise functional programming in C# is quite a bit more difficult.
On to his real point about F# allowing mutation... F# offers such things by design! It's pretty simple; no myths or breakthroughs there. He's got a few things flat our wrong too, like saying classes are mutable by default -- dunno where he came up with that. At any rate, it's quite easy to use lists of records or whatnot in F#, whereas generating compiler-enforced immutablity in C# is much more difficult. Just search for how to make an immutable class in C# -- it isn't easy! The fact that you'll use mutation to modify a Windows Form doesn't have any bearing on the overall ease-of-use that immutability has in F#.
C# and VB have said they'll co-evolve -- supposedly they'll have complete feature parity so it'll just be pure syntax. F#'s going to pick up what it needs for interop, such as supporting C#-style extension methods. C# picking up F# constructs? Good luck. Just search for how many C# users don't even understand what "var" is. Now you expect the VB/C# team to spend the time and money trying to add in all the stuff F# has? Like I said, good luck. I'd _love_ for C# to be more lightweight and functional. But as C# 4 brought nothing new in that aspect, I highly doubt this will happen.
If all you do is use .NET classes and string them together in an OO/imperative way, then yes, F# accomplishes the same thing, albeit with a lot less code. Even in projects where we ARE doing exactly this (NHibernate, ASP.MVC -- pretty standard stuff for C#), we end up with less code in F# because of type inference, pattern matching, and so on. So even if normal .NET stuff was the only thing we ever did, and we never used any of the F# types -- it'd still be a win over C#. (As one of our developers who recently switched from C# to F# on ASP.NET MVC projects said "I'm constantly surprised at how little code I need.")
Once you use workflows, powerful type inference, automatic generalization, discriminated unions, tuple support, etc. -- you cannot make the claim that it's just slightly more concise syntax.
As a test, try performing this: [link:blogs.msdn.com] with C#.
Compare the number of type and generic annotations you must write in C#, versus F#. For me, I really felt this when I had one C# project where the field definitions were over 300 characters long -- needlessly, I might add. In F#, the same thing would have been perhaps 40 chars.
With F#, I'm able to refactor to a much higher extent. Because I don't need to provide all the types for a function, I can easily let bind a couple lines of code, whereas in C#, the overhead to separate out the shared functionality is costs more than the benefit. And this applies to coding in any style in F#.
Anyways, good luck. I encourage you to give F# more of a review and really look at how you can write things easier and more concisely.
-Michael
(On the J# comment, I have no clue what you're talking about. I'm not sure how an outdated-by-design implementation of Java for .NET has anything to do with F#.)
thank you really.
Actually, my comments are mainly based on my understanding of F#. I need more clarifications on the importance and necessacity of using F#.
that comes out above viewpoints.
later, I have two more comments:
due to non-good readability of F# code (espcially, #light) (compared to, let us say, C#),
a big project may be considered with c# and a smaller project my be written in F#. Because later maintenance and update of the code may not be easy for F# code for a big project.
For an application related to data-based, such as engineering, computation, mathmatics, ... F# may be prefered and others may be prefered by c#.
thanks again.
Hi seraph,
Thanks for you interesting posts here :)
Please don't be discouraged that you are finding F# hard to read and learn initially. I hope that you find some good resources to learn it, and then discover what a powerful, and readable, language it is.
>> due to non-good readability of F# code (espcially, #light) (compared to, let us
>> say, C#),
I agree that #light is confusing in the early stages. However, the fact is that all examples you will see will use it, because it is actually much more readable to the experienced eye.
However I don't think that it's #light that's your main problem. I expect that you are just struggling with the functional nature of F#. This is not easy to overcome - I recommend that you focus first on the basic constructs of F# - pattern matching, "let" bindings, lists and recursion, and basic imperative constructs ("if..then.."), and leave object oriented programming, and .Net for until you've mastered these.
Pickering "Foundations of F#" Chapters 3 and 4 would be good for this.
As you can see from the replies here, as people become experienced with F# they find it much more readable than C#, and suitable for large and complex applications. But I won't say that it's easy to get there. It's certainly not helped by F# still being in it's formative stages, for implementation, documentation, community etc.
Good luck with it!
Javaman
Personally I think the assertion that F# is less readable than C# is complete bollocks. C# is more verbose, but that's not the same thing as clairt or understandability. For me F# removes heaps of unneccessary noise from the code thereby making it vastly easier to read and comprehend programs written in it.
Personally I think the assertion that F# is less readable than C# is complete bollocks. C# is more verbose, but that's not the same thing as clairt or understandability. For me F# removes heaps of unneccessary noise from the code thereby making it vastly easier to read and comprehend programs written in it.
I totally agree. For the most part, I now find F# code to be vastly more readable than C# or VB.NET, not only due to the low signal-to-noise ratio, but also because of match
statements, the ease of factoring out small functions, pipelining (|>), higher-order-functions, currying, workflows, etc.
See, for example, How does functional programming affect the structure of your code? for a discussion on how FP in general, and F# in particular, can have a positive impact in the code which actually gets work done.
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 |
Please have a look at the comments on F#:
[link:ikriv.com:8765]
I have the same feeling...
although Immutable data are encouranged in F#, but generally, mutable data can not be avoided in real world applications, actually, most applications will be mutable typles, from this viewpoint, F# may be nothing special to c#.
moreover, several features of F# has been or will be included in c# too. Finally, you will see that c# and F# will not be big difference except some syntex difference. This is because MS try always put advantages of some languages into another language. That is to say, c# and F# will be learned from each other. and therefore, most featuers in f# will be gruadually implemented in c# and vice versa. I think, it is better not do F#, instead it is time to develop a better new language, may be x#, a really new generation language, which can be considered as a revolution language. What is the future of F#?no one knows, because F# is nothing special to c# if you consider it carefully and deeply. I think, if only MS can provide enough support for F# such as powerful and convenient Math, chart, etc library as well as GUI, probably F# will be popular. or else, F# may be only a "fool" language and "fails" in the end. Franly speaking, I like F# only because it is concise, but it seems to me that MS includes F# only or mainly in considering a more complete .net language family. This is actually not right idea, after all it does not mean more language types bring more benefit. Like, j#, I do not know how many people is using j# today.
OK, Above is just my own thinking and feeling...