User Tools

Site Tools


projects:fsharp_workshop

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
projects:fsharp_workshop [2015/04/17 23:03] mkuciaprojects:fsharp_workshop [2015/05/02 12:45] (current) – [hello(x)] mkucia
Line 1: Line 1:
 ====== F# workshop ====== ====== F# workshop ======
 +{{:projects:fsharp_logo.png?nolink|}}
 ===== Prerequisites ===== ===== Prerequisites =====
     * https://www.linqpad.net/ or anything that can execute a REPL((Read, Evaluate, Print Loop))     * https://www.linqpad.net/ or anything that can execute a REPL((Read, Evaluate, Print Loop))
Line 22: Line 22:
 hello hello
 </code> </code>
 +
 +F# (pronounced “F Sharp”) is 
 +
 +<WRAP group>
 +<WRAP half column box>
 +  * 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
 +</WRAP>
 +
 +<WRAP half column box>
 +  * 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)
 +</WRAP>
 +</WRAP>
 +programming language for writing simple code to solve complex problems. 
  
 <code fsharp> <code fsharp>
Line 28: Line 54:
 </code> </code>
  
 +Introducing pipeline operator:
 <code fsharp> <code fsharp>
 let hello x = printfn "Hello %s" x let hello x = printfn "Hello %s" x
 "World" |> hello "World" |> hello
 </code> </code>
-''|>'' is the pipeline operator+ 
 +<hidden pipeline operator definition> 
 +How to define the operator?  
 +<code fsharp> 
 +let inline (|>) x f = f x 
 +</code> 
 +</hidden>
  
 <code fsharp> <code fsharp>
Line 57: Line 90:
 </code> </code>
  
-===== Why? =====+Note that F# uses indentation to indicate block structure. Find out more [[http://fsharpforfunandprofit.com/posts/fsharp-syntax/|here]].
  
-<WRAP group> +===== Getting data =====
-<WRAP half column box> +
-Pros: +
-  * Open Source +
-  * Multi platform (Mono, .NET core) +
-  * Modern, rising popularity +
-  * Lazy evaluation +
-  * Reusable +
-  * Reduced code (See [[http://theburningmonk.com/2014/12/seven-ineffective-coding-habits-many-f-programmers-dont-have/|signal-to-noise ratio]]) +
-  * Strongly typed +
-</WRAP>+
  
-<WRAP half column box+The following example loads data from webpage and stores it in CSV file. 
-Cons+ 
-  * Not suitable for real time (unpredictable performance+<hidden
-  * Functional languages fundamentally don't model how your computer works ⇒ harder to optimize+<code fsarp> 
-  * Different thinking process (you need to re-learn+open System.Net 
-</WRAP+open System 
-</WRAP>+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 @"<table id=""t2"">" GetLast 
 + |> split @"</table>"          GetFirst 
 +  
 +let removeAllTags text = 
 +    Regex.Replace(text, "<.*?>", String.Empty); 
 + 
 +let getCSVfromHTML rawHTML =  
 + let mutable (text:String) = String.Empty 
 + text <rawHTML 
 + text <- text.Replace(@"</th>", ";"); 
 + text <- text.Replace(@"</td>", ";"); 
 + text <- text.Replace(@"</tr>", Environment.NewLine); 
 + text <- text.Replace(',', '|'); 
 + text <- text.Replace('.', ','); 
 + text <- removeAllTags text 
 + text 
 + 
 +let CSVresult = getCSVfromHTML (getDataFromHTML getWebpageHTML) 
 +CSVresult.Dump(
 +</code
 +</hidden>
  
 +> 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 ===== ===== References =====
   * http://fsharp.org/   * http://fsharp.org/
projects/fsharp_workshop.txt · Last modified: 2015/05/02 12:45 by mkucia