====== F# workshop ======
{{:projects:fsharp_logo.png?nolink|}}
===== Prerequisites =====
* https://www.linqpad.net/ or anything that can execute a REPL((Read, Evaluate, Print Loop))
* Try F# in browser: http://www.tryfsharp.org/Create
* Use Visual Studio https://www.visualstudio.com/
* Get a full distribution: http://fsharp.org/use/windows/ OR http://fsharp.org/use/linux/
===== Agenda =====
* hello(x)
* Type providers (strongly typed)
* Matching
* Options
===== hello(x) =====
let hello = printf "Hello World"
hello
F# (pronounced “F Sharp”) is
* Open Source
* Multi platform
* Modern, rising popularity
* Lazy evaluated
* Reusable
* Concise (See [[http://theburningmonk.com/2014/12/seven-ineffective-coding-habits-many-f-programmers-dont-have/|signal-to-noise ratio]])
* Strongly typed
* Functional first
* Use functional to write easy to test and understand code
* Use imperative for performance and compatibility
* Use objective for organization and encapsulation
* Compiled
* Not suitable for real time (unpredictable performance)
* Hard to optimize (Functional languages fundamentally don't model how your computer works)
* Functional first (different thinking process, you will need to re-learn)
programming language for writing simple code to solve complex problems.
let hello x = printfn "Hello %s" x
hello "world"
Introducing pipeline operator:
let hello x = printfn "Hello %s" x
"World" |> hello
How to define the operator?
let inline (|>) x f = f x
let square x = x * x
let subtract x y = x - y
let ``complicated stuff`` x =
printfn "%d" (add 5 (square x))
let ``another complicated stuff`` x =
x |> square |> subtract 5 |> printfn "%d"
let equation x =
x
|> (fun y -> y * y )
|> (fun y z -> y - z ) 5
|> printfn "%d"
Note that F# uses indentation to indicate block structure. Find out more [[http://fsharpforfunandprofit.com/posts/fsharp-syntax/|here]].
===== Getting data =====
The following example loads data from webpage and stores it in CSV file.
open System.Net
open System
open System.IO
let myURL = @"..."
let fetchUrl callback url =
let req = WebRequest.Create(Uri(url))
use resp = req.GetResponse()
use stream = resp.GetResponseStream()
use reader = new IO.StreamReader(stream)
callback reader url
let myCallback (reader:IO.StreamReader) url =
let htmlSource = reader.ReadToEnd()
htmlSource
let getWebpageHTML = fetchUrl myCallback myURL
type FirstOrLast =
| GetFirst
| GetLast
let getDataFromHTML (rawHTML:String) =
let split (split_point:String) (firstOrLast:FirstOrLast) (text:String) =
let array = text.Split([|split_point|], 2, StringSplitOptions.RemoveEmptyEntries)
match firstOrLast with
| GetFirst -> array.First()
| GetLast -> array.Last()
rawHTML
|> split @"" GetFirst
let removeAllTags text =
Regex.Replace(text, "<.*?>", String.Empty);
let getCSVfromHTML rawHTML =
let mutable (text:String) = String.Empty
text <- rawHTML
text <- text.Replace(@"", ";");
text <- text.Replace(@"", ";");
text <- text.Replace(@"", Environment.NewLine);
text <- text.Replace(',', '|');
text <- text.Replace('.', ',');
text <- removeAllTags text
text
let CSVresult = getCSVfromHTML (getDataFromHTML getWebpageHTML)
CSVresult.Dump()
> An F# **type provider** is a component that provides types, properties, and methods for use in your program.
> The key to information-rich programming is to eliminate barriers to working with diverse information sources. One significant barrier to including a source of information into a program is the need to represent that information as types, properties, and methods for use in a programming language environment.
> Writing these types manually is very time-consuming and difficult to maintain. A common alternative is to use a code generator which adds files to your project; however, the conventional types of code generation do not integrate well into exploratory modes of programming supported by F# because the generated code must be replaced each time a service reference is adjusted.
===== References =====
* http://fsharp.org/
* http://fsharp3sample.codeplex.com/wikipage?Title=MicroSamples
* http://en.wikibooks.org/wiki/F_Sharp_Programming
* http://fsharp.org/specs/language-spec/3.0/FSharpSpec-3.0-final.pdf
* http://www.mindscapehq.com/blog/index.php/2012/03/27/5-12-f-features-every-c-programmer-should-lust-after/
* [[https://msdn.microsoft.com/en-us/library/dd233228.aspx|MSDN Symbol and Operator Reference (F#)]]
* https://github.com/rookboom/SharpShaders/wiki/Why-write-shaders-in-F%23%3F
* http://www.quora.com/What-are-some-limitations-disadvantages-of-functional-programming
* http://fsharpforfunandprofit.com/site-contents/
* http://research.microsoft.com/en-us/projects/kiwi/
* [[https://www.youtube.com/watch?v=hMjv8m--W28|Ten things F# can do, and C# can't - Liam McLennan @ DDD Brisbane 2013]]