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.
1 of 25
Download to read offline
More Related Content
[F#] Dev Life's Little Pleasures
1. [F#] DEV LIFES LITTLE PLEASURES
Natallie Baikevich,
F# enthusiast and financial dev
@lu_a_jalla
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, isnt 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>.
12. #3. THE BOILERPLATE
DevExpress layouts: Save/Restore
DockManager:
public void SaveLayoutToStream(Stream stream);
public void RestoreLayoutFromStream(Stream stream);
Grid:
public void SaveLayoutToStream(Stream stream);
public void RestoreLayoutFromStream(Stream stream);
13. #4. LOADING STOCK DATA FROM YAHOO
type Price = {
Oct 10, 2013
Date: DateTime
parse DateTime
33.31
parse float
33.38
parse float
Open: float
High: float
Low: float
Close: float
Volume: float
AdjClose: float option
}
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. WHATS 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