currying in swift

Post on 16-Nov-2014

153 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Lightning talk from iOSDevUK 2014

TRANSCRIPT

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

top related