Slides for my talk to the Bay Area Clojure User Group. Unlike most "entry level" F# talks, this presentation assumes some familiarity with functional programming concepts, although I think even folks unfamiliar with functional programming will find the content and demonstrations interesting. The talk includes a survey of the state of the F# community and community-driven (open source) projects.
1. 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
4. 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)
5. // 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
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
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 Crock Solution
FSI (REPL) compiles to assembly and executes
F# scripts
Fseye
Triple quoting
12. 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
13. 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
14. 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
15. 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
16. 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)
}
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)
}
22. 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
23. 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
24. FAKE
DSL implementation of build automation system
Full use of F# language
Access to any and all libraries
Develop with powerful debuggers and IDEs
28. 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
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 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
Bibliograhy and sandbox projects of all sample code.multi-paradigm language
Strongly type external data or computing resources dynamicallyDemo freebase type providerDemo R type provider
Let'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's say it's Vector for arguments sake, and let's say the task at hand is to do a breadth first traversal.
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.
Demo in CrockSolution w/ FsEye parsing into an eager rose tree
Demo in CrockSolution w/ FsEye parsing into an eager rose tree
…and that last line is just to prevent a compiler warning.
Monad Laws:Left identity:return a >>= f≡f aRight identity:m>>=return≡mAssociativity:(m >>= f)>>= g≡m >>=(\x -> f x >>= 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
The rec keyword is not required to be tail recursiveGetFiles returns a string[], so bang(!) required yield the entire enumerable
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
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
Demo in CrockSolution w/ FsEye
Unquote in TestSandbox
Demo in CrockSolution w/ FsEye
[Charting World Bank data with F#](http://funscript.info/live/worldbank.html)
http://fssnip.net/jQ
Java lib or app you want to use in a .NET app?.NET dll or app you want to use in the JVM?