SlideShare une entreprise Scribd logo
1  sur  25
[F#] DEV LIFE’S LITTLE PLEASURES
Natallie Baikevich,
F# enthusiast and financial dev
@lu_a_jalla
WE ARE EVERYWHERE!
THINGS TO CARE ABOUT:

• Correctness

• Efficiency
• Safety

• Conciseness
• Simplicity
Based on true stories

WHEN YOU MEET THE REAL WORLD…
#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?
#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
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)
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
#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>.
The copy-paste is still around, so

GO FOR GENERICS!
WHAT MAKES A PROGRAM WRITE ITSELF?
#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);
#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
}
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;

}
Good and Evil

MUTABILITY / STATE / MORE
#6. JUST CHECKING UPDATES
.NET List [ResizeArray]
foreach(var update in updatesList)
{
doSomethingWith(update);
}

System.InvalidOperationException: Collection was modified; enumeration
operation may not execute.
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)
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
The billion dollar mistake and co

MAKE ILLEGAL STATES UNREPRESENTABLE
(NULL)

We have an Option to avoid nulls!
#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 ->
Summing up

LET THE COMPILER HELP YOU!
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
QUESTIONS?

Contenu connexe

Similaire à [F#] Dev Life's Little Pleasures

Verilog Lecture3 hust 2014
Verilog Lecture3 hust 2014Verilog Lecture3 hust 2014
Verilog Lecture3 hust 2014
Béo Tú
 
Robots, Small Molecules & R
Robots, Small Molecules & RRobots, Small Molecules & R
Robots, Small Molecules & R
Rajarshi Guha
 
SOLID, DRY, SLAP design principles
SOLID, DRY, SLAP design principlesSOLID, DRY, SLAP design principles
SOLID, DRY, SLAP design principles
Sergey Karpushin
 

Similaire à [F#] Dev Life's Little Pleasures (20)

Verilog Lecture3 hust 2014
Verilog Lecture3 hust 2014Verilog Lecture3 hust 2014
Verilog Lecture3 hust 2014
 
Introduction to mysql part 3
Introduction to mysql part 3Introduction to mysql part 3
Introduction to mysql part 3
 
10 Billion a Day, 100 Milliseconds Per: Monitoring Real-Time Bidding at AdRoll
10 Billion a Day, 100 Milliseconds Per: Monitoring Real-Time Bidding at AdRoll10 Billion a Day, 100 Milliseconds Per: Monitoring Real-Time Bidding at AdRoll
10 Billion a Day, 100 Milliseconds Per: Monitoring Real-Time Bidding at AdRoll
 
The Ring programming language version 1.7 book - Part 10 of 196
The Ring programming language version 1.7 book - Part 10 of 196The Ring programming language version 1.7 book - Part 10 of 196
The Ring programming language version 1.7 book - Part 10 of 196
 
MySQL Stored Procedures: Building High Performance Web Applications
MySQL Stored Procedures: Building High Performance Web ApplicationsMySQL Stored Procedures: Building High Performance Web Applications
MySQL Stored Procedures: Building High Performance Web Applications
 
Robots, Small Molecules & R
Robots, Small Molecules & RRobots, Small Molecules & R
Robots, Small Molecules & R
 
Quantitative finance 101
Quantitative finance 101Quantitative finance 101
Quantitative finance 101
 
Quantitative finance 101
Quantitative finance 101Quantitative finance 101
Quantitative finance 101
 
The Ring programming language version 1.6 book - Part 9 of 189
The Ring programming language version 1.6 book - Part 9 of 189The Ring programming language version 1.6 book - Part 9 of 189
The Ring programming language version 1.6 book - Part 9 of 189
 
Array&pointer
Array&pointerArray&pointer
Array&pointer
 
Code optimization
Code optimization Code optimization
Code optimization
 
Code optimization
Code optimization Code optimization
Code optimization
 
Testing in the World of Functional Programming
Testing in the World of Functional ProgrammingTesting in the World of Functional Programming
Testing in the World of Functional Programming
 
Pl sql guide
Pl sql guidePl sql guide
Pl sql guide
 
Shift-Left Testing: QA in a DevOps World by David Laulusa
Shift-Left Testing: QA in a DevOps World by David LaulusaShift-Left Testing: QA in a DevOps World by David Laulusa
Shift-Left Testing: QA in a DevOps World by David Laulusa
 
Javascript Memory leaks and Performance & Angular
Javascript Memory leaks and Performance & AngularJavascript Memory leaks and Performance & Angular
Javascript Memory leaks and Performance & Angular
 
Matlab Workshop Presentation
Matlab Workshop PresentationMatlab Workshop Presentation
Matlab Workshop Presentation
 
SOLID, DRY, SLAP design principles
SOLID, DRY, SLAP design principlesSOLID, DRY, SLAP design principles
SOLID, DRY, SLAP design principles
 
2. overview of c#
2. overview of c#2. overview of c#
2. overview of c#
 
List Processing in ABAP
List Processing in ABAPList Processing in ABAP
List Processing in ABAP
 

Dernier

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Dernier (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 

[F#] Dev Life's Little Pleasures

  • 1. [F#] DEV LIFE’S LITTLE PLEASURES Natallie Baikevich, F# enthusiast and financial dev @lu_a_jalla
  • 3. THINGS TO CARE ABOUT: • Correctness • Efficiency • Safety • Conciseness • Simplicity
  • 4. Based on true stories WHEN YOU MEET THE REAL WORLD…
  • 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>.
  • 10. The copy-paste is still around, so GO FOR GENERICS!
  • 11. WHAT MAKES A PROGRAM WRITE ITSELF?
  • 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; }
  • 15. Good and Evil MUTABILITY / STATE / MORE
  • 16.
  • 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
  • 20. The billion dollar mistake and co MAKE ILLEGAL STATES UNREPRESENTABLE
  • 21. (NULL) We have an Option to avoid nulls!
  • 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 ->
  • 23. Summing up LET THE COMPILER HELP YOU!
  • 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