I haven't really found a tutorial with the requirements you mention (although I haven't really looked for one). I knew Haskell, Lisp and ML before I started using F#, so it was easier for me to identify and use the bits related to the functional paradigm, so I think a good strategy would be to look into other functional languages to check where you need to focus your efforts.
The Foundations of F# book starts by using the functional bits without really mentioning C# until later. Maybe that would help.
Hi,
Thank you. Each reference helps. I suppose the biggest difference between F# and other functional languages is that Microsoft intends it to be a full member of the managed languages it will support within Visual Studio - and, I'm guessing, may become the preferred language for other MS technologies, like DSL Tools.
I'd just like to encourage others that will be creating tutorials and introductions, of the value of not assuming a C# to F# translation is necessary or preferable.
Thanks for the reference,
BRN..
Thanks for the info and suggestions, Brian. You have highlighted a real need - ie. the need for a functional programming tutorial in F#.
When I got started with this two years ago it was very difficult to master the FP style, and I found that the OCaml tutorials were the most useful - although there were quite a few difficulties with this approach.
I would recommend the exercises and solutions from the University of Innsbruck. One problem is that it uses OCaml capitalization, and probably other stylistic differences from F#. Another problem is that one of the solutions is a reference to OCaml documentation. I got around that by installing OCaml on a Linux computer - and I have found it useful having OCaml available as an occasional reference for F# problems. Nevertheless, it is a very good kick-start with FP, and will also help you master whatever environment you are using (presumably VS)
Apart from the F# books, as mentioned in the previous response, I would also highly recommend the F# Wikibook. I don't know who's behind that, but whoever it is has done a really good job! It does begin with some comparisons with C#, but quickly launches into functional programming.
Hi,
Your reference suggestions are appreciated. I probably won't opt to explore OCaml, to get a better handle on F# (but glad some have for me); I'm prone to wander further from immediate objectives out of curiosity. I've added the Wikibook link to a fast growing collection of bookmarked tabs - looks like a good one.
A lot of the C# flavored tutorial/video/references have good content; but the conceptual flow is interrupted, rerouted, or otherwise compromised by the imperative/OOP/C# style/paradigm references.
A concern I have, is that the strong (and highly beneficial), connection to Microsoft and the .Net frameworks, will compel those directing the development of F# to mold it in terms C#/OOP to make it more accessible to accomplished C# developers - is adding the option of mutability a feature or a crutch?
Still too little experience on my part to say; but haven't you seen examples where F# code has been shoehorned into a C#/OOP mindset and style? There are plenty of C#/OOP to F# links out there; hope to find a few that let F# have its head.
Thanks again for the links,
BRN..
Hi,
>> is adding the option of mutability a feature or a crutch?
mutability is available in OCaml, in mostly the same places as F#. My quick experiment found that one can't declare a mutable "let" variable in OCaml ("let mutable x = o"), but mutable record fields are the same ("type index = {name : string; mutable index : int"}. I assume that this is because the functional programming field found a need for it.
>> haven't you seen examples where F# code has been shoehorned into a C#/OOP mindset and style?
Yes - kinda. A lot of .Net code (eg. a stream reader) translates into nearly identical F# code. I have sometimes wondered whether there is a more "functional" way of doing it, but each time I've tried, haven't been able to find it. The underlying reason (I suspect) is the .Net is object oriented, so, to use .Net, we have to write object oriented code. There are still enermous advantages in using .Net (and not just the libraries), so, overall, it's worth learing the mixed-style approach.
I think you are making a good choice in wanting to master the functional aspects of F#, separate from the OO and .Net style.
Cheers,
Javaman
Hi JM,
Good points.
During the presentation I saw at local INETA meeting, I asked about the MS CLR and F#. The response was along the lines of what you have said. The CLR will process the code from the different managed languages; but the CLR was written with a C#/OOP mindset - so the current CLR doesn't exploit the functional aspects of F# as well as it might.
I agree, the benefits of being a fully supported .Net language should not be under estimated. (and around here anyway, we get gobs of support from MS; .Net Road Shows, Code Camps, we had a XaML Fest tour stop here in the spring, and the MS Boston/Cambridge facilities are a 2 hour ride from here).
My impression so far, is that F# should make a better partner than C# with data modeling, and data manipulation. Immutability and safety are in line with concerns about inadvertent, or unmanaged, alterations to data. The ORM methodology I use is based on set theory, First Order Logic and predicate calculus - all important in F# as well. We get Tuples out of the box, so what more can I want.
Eventually, I'd like to try to leverage much of what an architect has done in an open source tool (a VS plug-in using DSL custom tools), that supports ORM (using C#), using F# and Silverlight/XaML for a tool that would cover a complementary aspect of the process.
I'm glad I got in after MS has added F# support in VS 2008 and the 2010 beta, and with a more mature syntax and feature set. I'm sure the learning curve is less bumpy than for those that had only Notepad and a CMD window.
Thanks again,
BRN..
Hi Brian,
Thanks for the interesting points.
Another suggestion for learning F# is to look at the coding problems which come up in these forums, particularly in General Discussions, and Howtos and Snippets.
Many of these problems are about functional programming in F#, and others are about .Net programming that raise interesting issues.
When you see an interesting problem, try and work out the solution yourself. It can be quite enlightening when you've worked out an 8 line solution, and then someone posts a one or two line answer!
This will also get you going with coding, which is what it's all about!
Regards,
JM
Hi JM,
More good suggestions; thanks.
I've backtracked a bit on saying I wouldn't look at OCaML. I found a book on functional programming, which uses Haskel to illustrate points. While I'd rather not muddy the waters with yet another syntax (as I'm still only learning F#'s), it seems worthwhile. Perhaps it's like taking a bearing from more than one position - it helps to better locate the target. I'm finding it more helpful than using imperative/OOP comparisons.
I take your point about tending towards brevity and elegance (Newton's F=ma and all that); but metrics and motivations are something I've thought about quite a bit. All else being equal, more concise, better performing, quicker into production equates to better code. However, "all else" is seldom"equal."
You're right, no substitute for writing some code, and seeing what happens. Fortunately (for me), F# is far enough along to provide some assistance. FSI is a big help too - immediate feedback. It won't remind me that computing the factorial for 300 (typo'd 30) may take a while; but that would be asking too much.
First significant snowfall here today - enjoy start to summer, down under.
BRN..
Hi JM,
I found a book on functional programming, which uses Haskel to illustrate points. While I'd rather not muddy the waters with yet another syntax (as I'm still only learning F#'s), it seems worthwhile. Perhaps it's like taking a bearing from more than one position - it helps to better locate the target. I'm finding it more helpful than using imperative/OOP comparisons.
BRN..
That can only strike me as a very good idea. I think that until one masters the functional aspects in isolation, it will always be a bit like trying to win a car race, using an automatic transmission.
And, it should be a lot of fun. I haven't used Haskell myself (apart from "hello, world"), but I've got a book on it there, that I'm intending to work through (Purely Functional Data Structure), as intellectual stimulation, and to make me a better F# programmer. You've inspired me to get on with it.
First significant snowfall here today - enjoy start to summer, down under.
Sighhh... brings back happy memories of a Vancouver winter, many years ago. Still, thanks for the wishes, and I'm looking forward to a hot Christmas, and farm holiday. Enjoy the snow and short days!
I just started reading "Purely Functional Data Structure" and I can say it is quite good but learning some ML notation before starting with it is recommended.
Hello Bernadette,
Yours was the first reply to suggest looking at other functional languages as an intro to F#. I think that is good advice for anyone.
One thing that comes through is that the creators of F# have added features to make it useful in OOP/imperative situations as well. Without a sense of the thinking behind functional programming, it's easy to miss the demarcations - and I'd think wondering between paradigms in a program would make it harder to sort out logical errors.
Depending on the programmer's intentions, it may be wise to keep to the functional way of doing things, when F# offers a choice. I wouldn't be surprised if some people, coming from an imperative language background, automatically gravitate to those features of F# that are familiar; and so miss out on the advantages of an alternative approach.
Thanks again for your good advice,
BRN..
I wouldn't be surprised if some people, coming from an imperative language background, automatically gravitate to those features of F# that are familiar; and so miss out on the advantages of an alternative approach.
I agree with you, having non-functional tools available distract you from using the functional ones unless you are familiar with the paradigm. Furthermore, it makes harder to reveal the functional goodies of F# as it may appear to others like just another .NET language with a slightly cumbersome syntax.
I believe the best way to tackle this problem is to focus on the functional bits from day one and pretty much ignore the rest as much as possible. It might take some time to get used to the paradigm, but the effort pays off since quite a lot of the information relevant to functional programming (specially the one in other programming languages) is less confusing and could be adapted to F#.
On that topic, I came across this Functional Programming Tutorial using Graham Hutton's Programming in Haskell. Highly recommended stuff![8-|]
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 |
Hi,
First exposure to F# at a local INETA presentation last week. I've been surfing and toying with the latest CTP and VS 2008 since. There's a lot to like with what I've seen so far. Unfortunately, nearly every tutorial, blog post and video has put F# in the context of C#. Sure, most coming to F# will have a C# or VB perspective - but even for these, a clean slate approach might be better.
What I'd like to see is F# presented as a new mindset, as well as a new language. Yes, interfacing with C# and VB code is important, but save that for later.
Anyone know of some tutorials and videos that avoid all the imperative language references?
Thanks,
BRN..