1) The document discusses various topics related to programming in F#, including currency exchange rate calculations, use of units of measure, generics, immutable data structures, pattern matching, and discriminated unions.
2) It provides code examples for calculating foreign exchange rates, loading stock data from Yahoo, and sending messages with different status types.
3) The document emphasizes techniques in F# for making illegal states unrepresentable, avoiding null references, and letting the compiler help catch errors through features like complete pattern matching.
5. #1. THE SPREADSHEET
How to gain by selling £17mln and buying $10mln?
• Buy $10mln
• Sell £16mln
• Spot Rate = 1.6
• GBP/USD =1.5945
• RGL = 88000
Pretty nice, isn’t it?
6. #1. THE CODE
let buyAmount, sellAmount = 10000000.0, 16000000.0
let spotRate = sellAmount / buyAmount // 1.6
let exchRate = 1.5945
let rgl amount spotRate exchRate =
amount * (spotRate - exchRate)
rgl sellAmount spotRate exchRate |> printfn "%A"
// 88000.0
7. UNITS OF MEASURE
[<Measure>] type USD
[<Measure>] type GBP
let buyAmount, sellAmount = 10000000.0<USD>, 16000000.0<GBP>
let spotRate = sellAmount / buyAmount
let exchRate = 1.5945<USD/GBP>
let rgl amount spotRate exchRate =
amount * (spotRate – exchRate)
8. UNITS OF MEASURE - FIXED
[<Measure>] type USD
[<Measure>] type GBP
let buyAmount, sellAmount = 10000000.0<USD>, 16000000.0<GBP>
let spotRate = buyAmount / sellAmount
let exchRate = 1.5945<USD/GBP>
let rgl amount spotRate exchRate =
amount * (spotRate – exchRate)
// -15512000.0
9. #2. THE OPPORTUNITIES
The same trick works for yield quotes! Get a 100 times
greater coupon. Or smaller. Whatever.
• 1 = 100%
• 1 % = 100 bp
… Or add <pct> and <bp>.
14. MEET GENERIC RESTRICTIONS
let inline tryParse str =
let mutable res = Unchecked.defaultof<_>
let ok = (^a: (static member TryParse: string * byref< ^a > -> bool) (str, &res))
res
match s.Split ',' with
| [| date; o; h; l; c; v; adj |] ->
Some { Date = tryParse date;
Open = tryParse o;
High = tryParse h;
}
17. #6. JUST CHECKING UPDATES
.NET List [ResizeArray]
foreach(var update in updatesList)
{
doSomethingWith(update);
}
System.InvalidOperationException: Collection was modified; enumeration
operation may not execute.
18. WHEN CHOOSE WHAT
Immutable
Mutable
• Safe
• Simple to read
• Performance optimizations
(e.g. Dictionary vs Map)
• Efficient data structures:
• Interop
• Check fsharpx
• F# Core extensions (ExtCore)
19. HOW
• let for values
• types: tuples, records, DUs
• core & community collections and data structures (list, map, set
and more)
Scala
F#
• val
• let
• var
• let mutable
22. #8. SEND A MESSAGE
match status with
| Pending ->
| Verified -> doSomething()
Pattern matching &
Discriminated Unions FTW!
FS0025: Incomplete pattern matches on this expression. For example,
the value '(_,Released)’
type Status =
| Pending
| Verified of User
| Released of User * DateTime
match msg with
| text, Verified user ->
24. WHAT’S NEXT?
• The big ones: Type Providers
• For those who is crazy about types: F*
Getting Started:
• The F# Software Foundation: http://fsharp.org/
• Try F# in your browser: http://www.tryfsharp.org/
• Snippets: http://www.fssnip.net/
• Join Twitter discussions: #fsharp