currying in swift
DESCRIPTION
Lightning talk from iOSDevUK 2014TRANSCRIPT
Currying in SwiftA 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.depositdepositor(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 youMaxim Zaks @iceX33