I love this one:
Out parameters are such crap. [:)]
Partial function application is pretty neat too:
Also, you could demonstrate how an immutable list is "copied":
I wouldn't just stick these on a slide, though. I'd type them directly into FSI. FSI is a pretty good demo all by itself.
let success, value = System.Int32.TryParse("12345")
Out parameters are such crap. [:)]
Partial function application is pretty neat too:
let multiply x y = x * y let numbers = [1; 2; 3; 4; 5;] let doubled = numbers |> List.map (multiply 2)
Also, you could demonstrate how an immutable list is "copied":
let list1 = [1;2;3;4;5;] let list2 = 0 :: list1 System.Object.ReferenceEquals(list1, list2.Tail)
I wouldn't just stick these on a slide, though. I'd type them directly into FSI. FSI is a pretty good demo all by itself.
Assuming pattern-matching is a full-fledged feature in C# 4.0, they could indeed wait. C# 3.0 already has lots of expressive power that is either functional or declarative: LINQ, IEnumerator, delegates & anonymous functions come to mind. Any programming I would do under contract in such a corporate setting I would likely stick to C# for non-linguistic reasons: the tools support is more mature and I would know programmers would be comfortable maintaining it. Coming from an OO C & Java background, I will say that the syntax and style of any of the functional languages are each a significant step for traditionally trained programmers, and I would hesitate to recommend such a switch in a multi-programmer data-centric production environment at this time.
Having said that, I will personally use F# whenever possible, so I am pondering how I would demonstrate what it is about it that makes that the case. I will try to come up with something, but understand that my basic message is to be cautious about whether there would be enough benefit.
What do I like about F#? Pattern-matching most of all. Type-inference, so don't have to always declare types, yet get the benefits of statically-typed code (performance, and compile-time verification avoiding many subtle mistakes). Tuples -- I've wanted tuples (especially multiple return values) in mainstream OO languages forever. In general, a more succinct style. Able to create a little function on the spot whenever need one, inline to a larger function. Can do this in C# with anonymous functions, but its clumsier and less expressive in many cases. Sequence expressions, including the ability to yield multiple results (including none) per loop. Explicit handling of "None". As a logician, the ad-hoc way nulls are dealt with in many languages drives me nuts -- how can anyone really verify anything in such non-mathematical models of computation?! And an overall benefit: the encouraging of a non-mutable logic style, improving reliability (avoiding subtle logic mistakes that leaves software in an unexpected state). If "mutable" is restricted to localized scopes, complex systems are easier to reliably construct.
Once I've completed a little demonstration of writing a Domain Specific Language parser in F#, I'll be able to pull some snippets from that. Here the pitch would be that a company can program against its data in a powerful way, without all the verbiage needed in normal programming. Though as a reality check, would have to contrast that with simply using LINQ. Most corporate data doesn't need to express recursion, which is what got me looking into deeper tree-search approaches. Hmm, the DSL work might give one angle: certain stuff is easier in F#, and since F# is a full .NET citizen, an F# module could be driven by a C# client. The public interface doesn't need to use any fancy F# data types or functional what-nots -- it can just be a normal-looking .NET class.
Having said that, I will personally use F# whenever possible, so I am pondering how I would demonstrate what it is about it that makes that the case. I will try to come up with something, but understand that my basic message is to be cautious about whether there would be enough benefit.
What do I like about F#? Pattern-matching most of all. Type-inference, so don't have to always declare types, yet get the benefits of statically-typed code (performance, and compile-time verification avoiding many subtle mistakes). Tuples -- I've wanted tuples (especially multiple return values) in mainstream OO languages forever. In general, a more succinct style. Able to create a little function on the spot whenever need one, inline to a larger function. Can do this in C# with anonymous functions, but its clumsier and less expressive in many cases. Sequence expressions, including the ability to yield multiple results (including none) per loop. Explicit handling of "None". As a logician, the ad-hoc way nulls are dealt with in many languages drives me nuts -- how can anyone really verify anything in such non-mathematical models of computation?! And an overall benefit: the encouraging of a non-mutable logic style, improving reliability (avoiding subtle logic mistakes that leaves software in an unexpected state). If "mutable" is restricted to localized scopes, complex systems are easier to reliably construct.
Once I've completed a little demonstration of writing a Domain Specific Language parser in F#, I'll be able to pull some snippets from that. Here the pitch would be that a company can program against its data in a powerful way, without all the verbiage needed in normal programming. Though as a reality check, would have to contrast that with simply using LINQ. Most corporate data doesn't need to express recursion, which is what got me looking into deeper tree-search approaches. Hmm, the DSL work might give one angle: certain stuff is easier in F#, and since F# is a full .NET citizen, an F# module could be driven by a C# client. The public interface doesn't need to use any fancy F# data types or functional what-nots -- it can just be a normal-looking .NET class.
Topic tags
- f# × 3656
- compiler × 263
- functional × 199
- c# × 119
- websharper × 112
- classes × 96
- web × 94
- book × 84
- .net × 82
- async × 72
- parallel × 43
- server × 43
- parsing × 41
- testing × 41
- asynchronous × 30
- monad × 28
- ocaml × 26
- tutorial × 26
- haskell × 25
- workflows × 22
- html × 21
- linq × 21
- introduction × 19
- silverlight × 19
- wpf × 19
- fpish × 18
- collections × 14
- pipeline × 14
- templates × 12
- monads × 11
- opinion × 10
- reactive × 10
- plugin × 9
- scheme × 9
- sitelets × 9
- solid × 9
- basics × 8
- concurrent × 8
- deployment × 8
- how-to × 8
- python × 8
- complexity × 7
- javascript × 6
- jquery × 6
- lisp × 6
- real-world × 6
- workshop × 6
- xaml × 6
- conference × 5
- dsl × 5
- java × 5
- metaprogramming × 5
- ml × 5
- scala × 5
- visual studio × 5
- formlets × 4
- fsi × 4
- lift × 4
- sql × 4
- teaching × 4
- alt.net × 3
- aml × 3
- enhancement × 3
- reflection × 3
- blog × 2
- compilation × 2
- computation expressions × 2
- corporate × 2
- courses × 2
- cufp × 2
- enterprise × 2
- entity framework × 2
- erlang × 2
- events × 2
- f# interactive × 2
- fsc × 2
- google maps × 2
- html5 × 2
- http × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- keynote × 2
- list × 2
- mvc × 2
- numeric × 2
- obfuscation × 2
- oop × 2
- packaging × 2
- pattern matching × 2
- pipelines × 2
- rx × 2
- script × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- type × 2
- type provider × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- addin × 1
- agents × 1
- agile × 1
- android × 1
- anonymous object × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net mvc × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- b-tree × 1
- bistro × 1
- bug × 1
- camtasia studio × 1
- canvas × 1
- class × 1
- client × 1
- clojure × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- combinator × 1
- confirm × 1
- constructor × 1
- continuation-passing style × 1
- coords × 1
- coursera × 1
- csla × 1
- css × 1
- data × 1
- database × 1
- declarative × 1
- delete × 1
- dhtmlx × 1
- discriminated union × 1
- distance × 1
- docs × 1
- documentation × 1
- dol × 1
- domain × 1
- du × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- error × 1
- etw × 1
- euclidean × 1
- event × 1
- example × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- fantomas × 1
- fear × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- function × 1
- functional style × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- google × 1
- group × 1
- hash × 1
- history × 1
- hosting × 1
- httpcontext × 1
- https × 1
- hubfs × 1
- ie 8 × 1
- if-doc × 1
- inheritance × 1
- installer × 1
- interpreter × 1
- io × 1
- ios × 1
- ipad × 1
- kendo × 1
- learning × 1
- licensing × 1
- macro × 1
- macros × 1
- maps × 1
- markup × 1
- marshal × 1
- math × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- multidimensional × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- nested × 1
- nested loops × 1
- node × 1
- object relation mapper × 1
- object-oriented × 1
- offline × 1
- option × 1
- orm × 1
- osx × 1
- owin × 1
- paper × 1
- parameter × 1
- performance × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- programming × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- ptvs × 1
- quant × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- real-time × 1
- reference × 1
- restful × 1
- round table × 1
- runtime × 1
- scriptcs × 1
- scripting × 1
- service × 1
- session-state × 1
- sitelet × 1
- stickynotes × 1
- stress × 1
- strong name × 1
- structures × 1
- tdd × 1
- template × 1
- tracing × 1
- tsunamiide × 1
- type inference × 1
- type providers × 1
- upload × 1
- vb × 1
- vb.net × 1
- vector × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio shell × 1
- visualstudio × 1
- web api × 1
- webapi × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- xml × 1
|
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us |
Built with WebSharper |
Can someone post their favorite snippets of code to demonstrate the power of F# vs. C# (or VB.NET)?
The code COULD assume some "background prerequisite" methods already created (in either F# or C#), to make the slide compelling. The audience would NOT be a programmer exploring fractals, for instance, but more like corporate programmers who manipulate lots of data/trees of data/lists.
The purpose would be to answer the question: Why should I learn F#...can't I just wait for C# version 4.0?