KEMBAR78
F# for functional enthusiasts | PPTX
F# for Functional Enthusiasts
Jack Fox
jackfoxy.com  craftyThoughts
@foxyjackfox
Bibliography
jackfoxy.com/Fsharp_functional_enthusiasts_bibliography
Sample Code
https://gist.github.com/jackfoxy/6679238
https://github.com/jackfoxy/CrockSolution
https://github.com/jackfoxy/TestSandbox
2012 annular eclipse observed by the author from Sugarloaf Peak, Lake Shasta
Type Providers
Microsoft.FSharp.Data.TypeProviders
DbmlFile
EdmxFile
ODataService
SqlDataConnection
SqlEntityConnection
WsdlService
Fsharpx
AppSettings
Excel
Graph
Machine
Management
Math
Regex
Xaml
Xrm
FSharp.Data
Apiary
Csv
Freebase
Json
WorldBank
Xml
F# 3.0 Sample Pack
DGML
Word
Csv
DataStore
Hadoop/Hive/Hdfs
HelloWorld
Management
MiniCvs
Xrm
Tsunami
RSS Reader
Start Menu
NuGetTypeProvider *
S3TypeProvider *
FacebookTypeProvider *
DocumentTypeProvider *
* (samples inside Tsunami)
in the wild on Github
FunScript
R
Matlab
IKVM (Java)
Python
PowerShell
strongly typed ≠ object oriented
Typed Clojure project on indiegogo.com
Parameterized Polymorphism
a.k.a. Generics
let inline unsigned bitSize (zero : 'a) (one : 'a) =
let one' = one + zero
let x' = one <<< (bitSize - 1)
x' ||| one'
bitSize:int -> zero: ^a -> one: ^a -> ^a
when ^a : (static member ( + ) : ^a * ^a -> ^a) and
^a : (static member ( <<< ) : ^a * int32 -> ^a) and
^a : (static member ( ||| ) : ^a * ^a -> ^a)
// Base Type Constraint
type Class1<'T when 'T :> System.Exception> …
// Interface Type Constraint
type Class2<'T when 'T :> System.IComparable> …
// Comparison constraint
type Class10<'T when 'T : comparison> …
// Member constraint with property
type Class6<'T when 'T : (member Property1 : int)> …
Constraints on Type Definitions
[<Measure>] type m // Distance, meters.
[<Measure>] type mile // Distance, miles.
[<Measure>] type s // Time, seconds.
[<Measure>] type h // Time, hours.
let distance1 = 100.0<m>
let distance2 = 250.0<mile>
let speedMetersPerSec = distance1 / 10.0<s> // float<m/s>
let speedMPH = distance2 / 5.0<h> // float<mile/h>
let x = distance1 + distance2 //will not compile
Units of Measure
Design Time Type Checking
So far…
Type Providers: strongly typed external data
Strong typing and type inference
Type constraints
Units of Measure
Next up…
Nuts and bolts programming
Vector
Eager Rose Tree
Vector
54321
Construct
Deconstruct
Initia
l
Las
t
[ ]
empt
y
;
;
type JsonValue =
| String of string
| Number of decimal
| Float of float
| Object of Map<string, JsonValue>
| Array of JsonValue[]
| Boolean of bool
| Null
JSON Parsing
Discriminated Union Type from
FSharp.Data
JSON Parsing
Demo Crock Solution
FSI (REPL) compiles to assembly and executes
F# scripts
Fseye
Triple quoting
Red Black Tree Balancing
Source: https://wiki.rice.edu/confluence/download/attachments/2761212/Okasaki-Red-Black.pdf
a b
c
d
b ca d
a
a
b c
d
b c
d
a
c
b
d
Talk about reducing complexity!
type 'a t = Node of color * 'a * 'a t * 'a t | Leaf
let balance = function
| Black, z, Node (Red, y, Node (Red, x, a, b), c), d
| Black, z, Node (Red, x, a, Node (Red, y, b, c)), d
| Black, x, a, Node (Red, z, Node (Red, y, b, c), d)
| Black, x, a, Node (Red, y, b, Node (Red, z, c, d)) ->
Node (Red, y, Node (Black, x, a, b), Node (Black, z, c, d))
| x -> Node x
Source: http://fsharpnews.blogspot.com/2010/07/f-vs-mathematica-red-black-
trees.html
Computational Expressions
One syntactic sugar to rule them all
( monad, monoid, applicative functor )
seq {for n in 1..10 do
yield n
yield n * 2}
seq {for n in 1..10 do
yield (n, n * 2)}
Sequence Generators
Computational Expressions
Recursive Generators
let rec listFiles dir = seq {
yield! Directory.GetFiles(dir)
for subdir in Directory.GetDirectories(dir) do
yield! listFiles subdir }
let musicFiles = listFiles "E:music" |> List.ofSeq
Computational Expressions
Query Expressions
let htmlPage =
query { for content in db.tbContentLib do
where (content.companyID.Value > 0 and content.isHtml)
join template in db.tbTemplate on
(content.templateID.Value = template.templateID)
select (content.styleID, template.title, template.body)
}
Computational Expressions
Query Expressions (Freebase)
let topBooksWithNameContaining (s:string) =
query { for book in
data.``Arts and Entertainment``.Books.Books
do
where (book.Name.ApproximatelyMatches s)
take 10
select book.Name }
Async
let someBinding =
async {
let! x = … // asynchronous binding
let y = … // synchronous binding
let! z = … // another asynchronous binding
do! … // asynchronous execution
return z // return something (or not)
}
Agents
a.k.a. Mailbox Processor
Message passing
Actor Model
Erlang-like processing
{m}brace
Cloud Computing (beta)
[<Cloud>]
let calculatePi (iterations : bigint) (digits : int) : ICloud<string> =
cloud {
let! workers = Cloud.GetWorkerCount()
let workers = bigint (2 * workers)
...
let runWorker iterations = cloud { return monteCarloPiWorker iterations }
let! results =
...
|> Cloud.Parallel
...
return getDigits a b
|> ...
}
Quotations
let ``Vector<Vector<'T>>, windowSeq``() =
test<@ [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10;] =
([0; 1; 2; 3; 4; 5; 6; 7; 8; 9; ]
|> Vector.windowSeq 3
|> Vector.flatten
|> List.ofSeq) @>
Now we’ve seen…
ML-style pattern matching
Syntactic sugar over common FP abstractions
Async and friends
Quotations
Next: Community-Driven Development
Fsharp.org
Some “core” projects
Dev environments
Fsharp.org
F# Foundation
Owns resources relating to F# including:
the domain fsharp.org
the github.com/fsharp community organization
the fsharporg twitter account
Seeks to:
promote the adoption of F#
expand the relevance and importance of F# skills and knowledge
expand the range of technologies which can interoperate with F#
expand the range of platforms where F# can be used
facilitate the ongoing development of F#-related technology and resources
FAKE
 DSL implementation of build automation system
 Full use of F# language
 Access to any and all libraries
 Develop with powerful debuggers and IDEs
Literate Programming
FSharp.Formatting
Funscript
Javascript and Single Page Apps
JQuery and Javascript DOM APIs
TypeScript TypeProvider
Mini Web Server
Websharper
Fully composeable client-server web development.
#websharper on irc.freenode.net
GPU Process
Alea.cuBase
Complete commercial solution to develop highly optimized
CUDA accelerated GPU applications from F# quotations by
QuantAlea.
Advantages of functional composition and rapid prototyping
Don’t have a NVIDIA card?
Try Brahma.Fsharp F# quotations to OpenCL translation
Testing Options
FsUnit – native F# functional syntax across test tools
FsCheck – QuickCheck for F#
TickSpec – lightweight, but fully featured Gherkin BDD
Canopy – lightweight F# syntax for web-client Selenium testing
Unquote – step-by-step F# expression evaluations
Development Alternatives
Tsunami IDE (beta)
Visual Studio 2010, 2012, 2013 (free Express edition)
Xamarin Studio -- iOS, Android, Mac, Mono, .NET
(free edition limits project size)
Emacs
Vim
SublimeText
IKVM lets Java and .NET Get Along!
Java from .NET, .NET from Java
JVM bytecode  IL instruction  native JIT
(not a bunch of wrappers)
10+ years of development effort
Actively supported
Powers Mono
Extremely few edge incompatibilities
Questions?
F# Programming
http://en.wikibooks.org/wiki/F_Sharp_Programming
A Course of F# Study
http://jackfoxy.com/a-course-of-fsharp-study
A directory of useful pages
http://fsharpforfunandprofit.com/site-contents
Learning F#

F# for functional enthusiasts

  • 1.
    F# for FunctionalEnthusiasts Jack Fox jackfoxy.com  craftyThoughts @foxyjackfox Bibliography jackfoxy.com/Fsharp_functional_enthusiasts_bibliography Sample Code https://gist.github.com/jackfoxy/6679238 https://github.com/jackfoxy/CrockSolution https://github.com/jackfoxy/TestSandbox 2012 annular eclipse observed by the author from Sugarloaf Peak, Lake Shasta
  • 2.
    Type Providers Microsoft.FSharp.Data.TypeProviders DbmlFile EdmxFile ODataService SqlDataConnection SqlEntityConnection WsdlService Fsharpx AppSettings Excel Graph Machine Management Math Regex Xaml Xrm FSharp.Data Apiary Csv Freebase Json WorldBank Xml F# 3.0Sample Pack DGML Word Csv DataStore Hadoop/Hive/Hdfs HelloWorld Management MiniCvs Xrm Tsunami RSS Reader Start Menu NuGetTypeProvider * S3TypeProvider * FacebookTypeProvider * DocumentTypeProvider * * (samples inside Tsunami) in the wild on Github FunScript R Matlab IKVM (Java) Python PowerShell
  • 3.
    strongly typed ≠object oriented Typed Clojure project on indiegogo.com
  • 4.
    Parameterized Polymorphism a.k.a. Generics letinline unsigned bitSize (zero : 'a) (one : 'a) = let one' = one + zero let x' = one <<< (bitSize - 1) x' ||| one' bitSize:int -> zero: ^a -> one: ^a -> ^a when ^a : (static member ( + ) : ^a * ^a -> ^a) and ^a : (static member ( <<< ) : ^a * int32 -> ^a) and ^a : (static member ( ||| ) : ^a * ^a -> ^a)
  • 5.
    // Base TypeConstraint type Class1<'T when 'T :> System.Exception> … // Interface Type Constraint type Class2<'T when 'T :> System.IComparable> … // Comparison constraint type Class10<'T when 'T : comparison> … // Member constraint with property type Class6<'T when 'T : (member Property1 : int)> … Constraints on Type Definitions
  • 6.
    [<Measure>] type m// Distance, meters. [<Measure>] type mile // Distance, miles. [<Measure>] type s // Time, seconds. [<Measure>] type h // Time, hours. let distance1 = 100.0<m> let distance2 = 250.0<mile> let speedMetersPerSec = distance1 / 10.0<s> // float<m/s> let speedMPH = distance2 / 5.0<h> // float<mile/h> let x = distance1 + distance2 //will not compile Units of Measure Design Time Type Checking
  • 7.
    So far… Type Providers:strongly typed external data Strong typing and type inference Type constraints Units of Measure Next up… Nuts and bolts programming
  • 8.
  • 9.
  • 10.
    type JsonValue = |String of string | Number of decimal | Float of float | Object of Map<string, JsonValue> | Array of JsonValue[] | Boolean of bool | Null JSON Parsing Discriminated Union Type from FSharp.Data
  • 11.
    JSON Parsing Demo CrockSolution FSI (REPL) compiles to assembly and executes F# scripts Fseye Triple quoting
  • 12.
    Red Black TreeBalancing Source: https://wiki.rice.edu/confluence/download/attachments/2761212/Okasaki-Red-Black.pdf a b c d b ca d a a b c d b c d a c b d
  • 13.
    Talk about reducingcomplexity! type 'a t = Node of color * 'a * 'a t * 'a t | Leaf let balance = function | Black, z, Node (Red, y, Node (Red, x, a, b), c), d | Black, z, Node (Red, x, a, Node (Red, y, b, c)), d | Black, x, a, Node (Red, z, Node (Red, y, b, c), d) | Black, x, a, Node (Red, y, b, Node (Red, z, c, d)) -> Node (Red, y, Node (Black, x, a, b), Node (Black, z, c, d)) | x -> Node x Source: http://fsharpnews.blogspot.com/2010/07/f-vs-mathematica-red-black- trees.html
  • 14.
    Computational Expressions One syntacticsugar to rule them all ( monad, monoid, applicative functor ) seq {for n in 1..10 do yield n yield n * 2} seq {for n in 1..10 do yield (n, n * 2)} Sequence Generators
  • 15.
    Computational Expressions Recursive Generators letrec listFiles dir = seq { yield! Directory.GetFiles(dir) for subdir in Directory.GetDirectories(dir) do yield! listFiles subdir } let musicFiles = listFiles "E:music" |> List.ofSeq
  • 16.
    Computational Expressions Query Expressions lethtmlPage = query { for content in db.tbContentLib do where (content.companyID.Value > 0 and content.isHtml) join template in db.tbTemplate on (content.templateID.Value = template.templateID) select (content.styleID, template.title, template.body) }
  • 17.
    Computational Expressions Query Expressions(Freebase) let topBooksWithNameContaining (s:string) = query { for book in data.``Arts and Entertainment``.Books.Books do where (book.Name.ApproximatelyMatches s) take 10 select book.Name }
  • 18.
    Async let someBinding = async{ let! x = … // asynchronous binding let y = … // synchronous binding let! z = … // another asynchronous binding do! … // asynchronous execution return z // return something (or not) }
  • 19.
    Agents a.k.a. Mailbox Processor Messagepassing Actor Model Erlang-like processing
  • 20.
    {m}brace Cloud Computing (beta) [<Cloud>] letcalculatePi (iterations : bigint) (digits : int) : ICloud<string> = cloud { let! workers = Cloud.GetWorkerCount() let workers = bigint (2 * workers) ... let runWorker iterations = cloud { return monteCarloPiWorker iterations } let! results = ... |> Cloud.Parallel ... return getDigits a b |> ... }
  • 21.
    Quotations let ``Vector<Vector<'T>>, windowSeq``()= test<@ [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10;] = ([0; 1; 2; 3; 4; 5; 6; 7; 8; 9; ] |> Vector.windowSeq 3 |> Vector.flatten |> List.ofSeq) @>
  • 22.
    Now we’ve seen… ML-stylepattern matching Syntactic sugar over common FP abstractions Async and friends Quotations Next: Community-Driven Development Fsharp.org Some “core” projects Dev environments
  • 23.
    Fsharp.org F# Foundation Owns resourcesrelating to F# including: the domain fsharp.org the github.com/fsharp community organization the fsharporg twitter account Seeks to: promote the adoption of F# expand the relevance and importance of F# skills and knowledge expand the range of technologies which can interoperate with F# expand the range of platforms where F# can be used facilitate the ongoing development of F#-related technology and resources
  • 24.
    FAKE  DSL implementationof build automation system  Full use of F# language  Access to any and all libraries  Develop with powerful debuggers and IDEs
  • 25.
  • 26.
    Funscript Javascript and SinglePage Apps JQuery and Javascript DOM APIs TypeScript TypeProvider Mini Web Server
  • 27.
    Websharper Fully composeable client-serverweb development. #websharper on irc.freenode.net
  • 28.
    GPU Process Alea.cuBase Complete commercialsolution to develop highly optimized CUDA accelerated GPU applications from F# quotations by QuantAlea. Advantages of functional composition and rapid prototyping Don’t have a NVIDIA card? Try Brahma.Fsharp F# quotations to OpenCL translation
  • 29.
    Testing Options FsUnit –native F# functional syntax across test tools FsCheck – QuickCheck for F# TickSpec – lightweight, but fully featured Gherkin BDD Canopy – lightweight F# syntax for web-client Selenium testing Unquote – step-by-step F# expression evaluations
  • 30.
    Development Alternatives Tsunami IDE(beta) Visual Studio 2010, 2012, 2013 (free Express edition) Xamarin Studio -- iOS, Android, Mac, Mono, .NET (free edition limits project size) Emacs Vim SublimeText
  • 31.
    IKVM lets Javaand .NET Get Along! Java from .NET, .NET from Java JVM bytecode  IL instruction  native JIT (not a bunch of wrappers) 10+ years of development effort Actively supported Powers Mono Extremely few edge incompatibilities
  • 32.
    Questions? F# Programming http://en.wikibooks.org/wiki/F_Sharp_Programming A Courseof F# Study http://jackfoxy.com/a-course-of-fsharp-study A directory of useful pages http://fsharpforfunandprofit.com/site-contents Learning F#

Editor's Notes

  • #2 Bibliograhy and sandbox projects of all sample code.multi-paradigm language
  • #3 Strongly type external data or computing resources dynamicallyDemo freebase type providerDemo R type provider
  • #9 Let&apos;s take the example of a Multiway Tree. Many kinds of documents can assume this form, HTML, XML, JSON docs, for example. We could model the sequences represented here with any linear data structure. Let&apos;s say it&apos;s Vector for arguments sake, and let&apos;s say the task at hand is to do a breadth first traversal.
  • #10 Enter the Vector. Indexed lookup and update are pretty close to constant time, O(log32n) if you are keeping score, construction and deconstruction at the end of the sequence, more in line with how humans normally think of extending a linear sequence. You would probably construct days of observed weather this way, for instance.Steffen Forkmann’s implementation of Vector from Clojure. It implements a hash array mapped trie internally. It’s very fast, gives you essentially all the functionality of F# Array, with the added qualities of persistence and the ability to grow and shrink efficiently at the end of the sequence. Vector is probably the most versatile and performant purely functional structure for covering most of your needs involving eager evaluation since it includes indexed lookup and update.
  • #11 Demo in CrockSolution w/ FsEye parsing into an eager rose tree
  • #12 Demo in CrockSolution w/ FsEye parsing into an eager rose tree
  • #14 …and that last line is just to prevent a compiler warning.
  • #15 Monad Laws:Left identity:return a &gt;&gt;= f≡f aRight identity:m&gt;&gt;=return≡mAssociativity:(m &gt;&gt;= f)&gt;&gt;= g≡m &gt;&gt;=(\x -&gt; f x &gt;&gt;= g)Monoid Laws:Closure: Associativity: mappend x (mappend y z)=mappend(mappend x y) zIdentity element: mappendmempty x = x mappend x mempty= xevery monad is an applicative functor, but not conversely
  • #16 The rec keyword is not required to be tail recursiveGetFiles returns a string[], so bang(!) required yield the entire enumerable
  • #17 Inverted SQL style from LINQ“content.templateID.Value” because external data is poorly typed (it includes nulls) so it is returned as an Option type
  • #18 Inverted SQL style from LINQ“content.templateID.Value” because external data is poorly typed (it includes nulls) so it is returned as an Option type
  • #19 Demo in CrockSolution w/ FsEye
  • #22 Unquote in TestSandbox
  • #26 Demo in CrockSolution w/ FsEye
  • #27 [Charting World Bank data with F#](http://funscript.info/live/worldbank.html)
  • #31 http://fssnip.net/jQ
  • #32 Java lib or app you want to use in a .NET app?.NET dll or app you want to use in the JVM?