Currying in Swift 
A tale of state encapsulation 
Maxim Zaks @iceX33
Every presentation 
needs a theme
func amountWithVat(vat:Float, amount: Float) -> Float { 
return roundf((1 + vat) * amount) 
} 
let amount1 = amountWithVat(0.19, 100) 
let amount2 = amountWithVat(0.19, 200) 
let amount3 = amountWithVat(0.2, 300)
func amountWithVat(vat:Float)(amount: Float) -> Float { 
return roundf((1 + vat) * amount) 
} 
let addGermanVatTo = amountWithVat(0.19) 
let addUKVatTo = amountWithVat(0.2) 
let amount1 = addGermanVatTo(amount: 100) 
let amount2 = addGermanVatTo(amount: 200) 
let amount3 = addUKVatTo(amount: 300)
func amountWithVat( vat : Float, 
roundFunction : (Float)->Float = roundf) 
(amount: Float) -> Float { 
return roundFunction((1 + vat) * amount) 
} 
let addGermanVatTo = amountWithVat(0.19){ 
roundf($0 * 100) / 100 
} 
let addUKVatTo = amountWithVat(0.2) 
let amount1 = addGermanVatTo(amount: 101) 
let amount2 = addGermanVatTo(amount: 200) 
let amount3 = addUKVatTo(amount: 300)
Should we consider 
currying as a 
revelation?
func amountWithVat(vat:Float)(amount: Float) -> Float { 
return roundf((1 + vat) * amount) 
} 
let addGermanVatTo = amountWithVat(0.19) 
let addUKVatTo = amountWithVat(0.2) 
let amount1 = addGermanVatTo(amount: 100) 
let amount2 = addGermanVatTo(amount: 200) 
let amount3 = addUKVatTo(amount: 300)
func amountWithVat(vat:Float) -> Float -> Float { 
return { (amount:Float) -> Float in 
return roundf((1 + vat) * amount) 
} 
} 
let addGermanVatTo = amountWithVat(0.19) 
let addUKVatTo = amountWithVat(0.2) 
let amount1 = addGermanVatTo(100) 
let amount2 = addGermanVatTo(200) 
let amount3 = addUKVatTo(300)
typedef float (^FloatToFloat)(float); 
FloatToFloat (^amountWithVat)(float) = 
^FloatToFloat (float vat) { 
return ^(float amount){ 
return roundf((1 + vat) * amount); 
}; 
}; 
FloatToFloat addGermanVatTo = amountWithVat(.19); 
FloatToFloat addUKVatTo = amountWithVat(0.2); 
float amount1 = addGermanVatTo(100); 
float amount2 = addGermanVatTo(200); 
float amount3 = addUKVatTo(300);
Interesting application of function currying found out 
by Ole Begemann 
(http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/)
class BankAccount { 
var balance: Double = 0.0 
func deposit(amount: Double) { 
balance += amount 
} 
} 
let account = BankAccount() 
account.deposit(100) // balance is now 100 
let depositor = BankAccount.deposit 
depositor(account)(100) // balance is now 200
So every method is implemented internaly through 
function currying
One More Thing
Who knows the name 
of the show I used for 
the theme
Thank you 
Maxim Zaks @iceX33

Currying in Swift

  • 1.
    Currying in Swift A tale of state encapsulation Maxim Zaks @iceX33
  • 2.
  • 3.
    func amountWithVat(vat:Float, amount:Float) -> Float { return roundf((1 + vat) * amount) } let amount1 = amountWithVat(0.19, 100) let amount2 = amountWithVat(0.19, 200) let amount3 = amountWithVat(0.2, 300)
  • 4.
    func amountWithVat(vat:Float)(amount: Float)-> Float { return roundf((1 + vat) * amount) } let addGermanVatTo = amountWithVat(0.19) let addUKVatTo = amountWithVat(0.2) let amount1 = addGermanVatTo(amount: 100) let amount2 = addGermanVatTo(amount: 200) let amount3 = addUKVatTo(amount: 300)
  • 5.
    func amountWithVat( vat: Float, roundFunction : (Float)->Float = roundf) (amount: Float) -> Float { return roundFunction((1 + vat) * amount) } let addGermanVatTo = amountWithVat(0.19){ roundf($0 * 100) / 100 } let addUKVatTo = amountWithVat(0.2) let amount1 = addGermanVatTo(amount: 101) let amount2 = addGermanVatTo(amount: 200) let amount3 = addUKVatTo(amount: 300)
  • 6.
    Should we consider currying as a revelation?
  • 7.
    func amountWithVat(vat:Float)(amount: Float)-> Float { return roundf((1 + vat) * amount) } let addGermanVatTo = amountWithVat(0.19) let addUKVatTo = amountWithVat(0.2) let amount1 = addGermanVatTo(amount: 100) let amount2 = addGermanVatTo(amount: 200) let amount3 = addUKVatTo(amount: 300)
  • 8.
    func amountWithVat(vat:Float) ->Float -> Float { return { (amount:Float) -> Float in return roundf((1 + vat) * amount) } } let addGermanVatTo = amountWithVat(0.19) let addUKVatTo = amountWithVat(0.2) let amount1 = addGermanVatTo(100) let amount2 = addGermanVatTo(200) let amount3 = addUKVatTo(300)
  • 9.
    typedef float (^FloatToFloat)(float); FloatToFloat (^amountWithVat)(float) = ^FloatToFloat (float vat) { return ^(float amount){ return roundf((1 + vat) * amount); }; }; FloatToFloat addGermanVatTo = amountWithVat(.19); FloatToFloat addUKVatTo = amountWithVat(0.2); float amount1 = addGermanVatTo(100); float amount2 = addGermanVatTo(200); float amount3 = addUKVatTo(300);
  • 10.
    Interesting application offunction currying found out by Ole Begemann (http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/)
  • 11.
    class BankAccount { var balance: Double = 0.0 func deposit(amount: Double) { balance += amount } } let account = BankAccount() account.deposit(100) // balance is now 100 let depositor = BankAccount.deposit depositor(account)(100) // balance is now 200
  • 12.
    So every methodis implemented internaly through function currying
  • 13.
  • 14.
    Who knows thename of the show I used for the theme
  • 16.
    Thank you MaximZaks @iceX33