А нам-то зачем функциональное программирование?

49
А нам-то зачем функциональное программирование? Вагиф Абилов Miles Norway

Upload: vagif-abilov

Post on 19-Jul-2015

220 views

Category:

Software


3 download

TRANSCRIPT

Page 1: А нам-то зачем функциональное программирование?

А нам-то зачем функциональное программирование?

Вагиф Абилов

Miles Norway

Page 2: А нам-то зачем функциональное программирование?
Page 3: А нам-то зачем функциональное программирование?
Page 4: А нам-то зачем функциональное программирование?

http://www.codeproject.com

Page 5: А нам-то зачем функциональное программирование?
Page 6: А нам-то зачем функциональное программирование?
Page 7: А нам-то зачем функциональное программирование?
Page 8: А нам-то зачем функциональное программирование?
Page 9: А нам-то зачем функциональное программирование?
Page 10: А нам-то зачем функциональное программирование?
Page 11: А нам-то зачем функциональное программирование?
Page 12: А нам-то зачем функциональное программирование?
Page 13: А нам-то зачем функциональное программирование?

A short poem by Afanasy Fet (1850) without a single verb

Page 14: А нам-то зачем функциональное программирование?
Page 15: А нам-то зачем функциональное программирование?
Page 16: А нам-то зачем функциональное программирование?
Page 17: А нам-то зачем функциональное программирование?
Page 18: А нам-то зачем функциональное программирование?
Page 19: А нам-то зачем функциональное программирование?

let neighbours (x, y) =[ for i in x-1..x+1 do for j in y-1..y+1 do

if not (i = x && j = y) then yield (i,j) ]

let isAlive population cell =population|> List.exists ((=) cell)

let aliveNeighbours population cell = neighbours cell|> List.filter (isAlive population)

Page 20: А нам-то зачем функциональное программирование?

let survives population cell = aliveNeighbours population cell |> List.length|> fun x -> x >= 2 && x <= 3

let reproducible population cell = aliveNeighbours population cell |> List.length = 3

Page 21: А нам-то зачем функциональное программирование?

let allDeadNeighbours population = population |> List.collect neighbours|> Set.ofList |> Set.toList|> List.filter (not << isAlive population)

let nextGeneration population = List.append

(population |> List.filter (survives population))(allDeadNeighbours population|> List.filter (reproducible population))

Note use of colors: the only word in white is ”population". No variables!

Page 22: А нам-то зачем функциональное программирование?
Page 23: А нам-то зачем функциональное программирование?

let isAlive population cell =population|> List.exists ((=) cell)

let aliveNeighbours population cell = neighbours cell|> List.filter (isAlive population)

let survives population cell = aliveNeighbours population cell |> List.length|> fun x -> x >= 2 && x <= 3

let reproducible population cell = aliveNeighbours population cell |> List.length = 3

let allDeadNeighbours population = population |> List.collect neighbours|> Set.ofList |> Set.toList|> List.filter (not << isAlive population)

let nextGeneration population = List.append

(population |> List.filter

(survives population))(allDeadNeighbours population|> List.filter

(reproducible population))

Page 24: А нам-то зачем функциональное программирование?

let neighbours (x, y) =[ for i in x-1..x+1 do for j in y-1..y+1 do

if not (i = x && j = y) then yield (i,j) ]

let neighbours (x, y, z) =[ for i in x-1..x+1 do for j in y-1..y+1 do for k in z-1..z+1 do

if not (i = x && j = y && k = z) then yield (i,j,k) ]

Page 25: А нам-то зачем функциональное программирование?

type Color = Red | Green | Blue | White | Gray| Black | Orange | Yellow | Brown

let neighbours color =match color with| Red -> [Red; Orange; Brown] | Green -> [Green; Blue; Yellow] | Blue -> [Blue; Green] | White -> [White; Gray] | Black -> [Black; Gray] | Gray -> [Gray; Black; White] | Orange -> [Orange; Red; Yellow] | Yellow -> [Yellow; Orange; Green] | Brown -> [Brown; Red]

Page 26: А нам-то зачем функциональное программирование?

let isAlive population cell =population|> List.exists ((=) cell)

let aliveNeighbours population cell = neighbours cell|> List.filter (isAlive population)

let survives population cell = aliveNeighbours population cell |> List.length|> fun x -> x >= 2 && x <= 3

let reproducible population cell = aliveNeighbours population cell |> List.length = 3

let allDeadNeighbours population = population |> List.collect neighbours|> Set.ofList |> Set.toList|> List.filter (not << isAlive population)

let nextGeneration population = List.append

(population |> List.filter

(survives population))(allDeadNeighbours population|> List.filter

(reproducible population))

Page 27: А нам-то зачем функциональное программирование?
Page 28: А нам-то зачем функциональное программирование?

// Sequential solutionlet nextGeneration population =

List.append(population |> List.filter (survives population))(allDeadNeighbours population|> List.filter (reproducible population))

// Parallel solutionlet nextGeneration population =

seq {yield (population

|> PList.filter (survives population))yield (allDeadNeighbours population

|> PList.filter (reproducible population)) } |> PSeq.toList

Page 29: А нам-то зачем функциональное программирование?
Page 30: А нам-то зачем функциональное программирование?
Page 31: А нам-то зачем функциональное программирование?

http://bit.ly/1MI0kLd

http://bit.ly/1GTFpRw

Page 32: А нам-то зачем функциональное программирование?
Page 33: А нам-то зачем функциональное программирование?

type CardType = VISA | MasterCard | AmEx | Diners | Domestic

type CardNumber = string

type PaymentMethod = | Cash | Cheque of int| Card of CardType * CardNumber

Page 34: А нам-то зачем функциональное программирование?

let calculateTips sum paymentMethod = match paymentMethod with | Cash -> sum * 0.05 | Cheque _ -> sum * 0.20 | Card (cardType, _) when cardType = Domestic -> sum * 0.10 | Card (_, _) -> sum * 0.15

Page 35: А нам-то зачем функциональное программирование?

Term "Railway Oriented Programming" coined by Scott Wlaschin

Page 36: А нам-то зачем функциональное программирование?

Source: http://bit.ly/1CqGyAN

Page 37: А нам-то зачем функциональное программирование?

Product|> placeInShoppingCart|> proceedToCheckout|> selectShipmentMethod|> selectPaymentMethod|> authorizePayment

Page 38: А нам-то зачем функциональное программирование?

let ``Block should not change``() = let population = [(1,1); (1,2); (2,1); (2,2)] population |> nextGeneration|> should equal population

Page 39: А нам-то зачем функциональное программирование?

Scenario

Given

And 3

When

Then 4

Page 40: А нам-то зачем функциональное программирование?

let [<Given>] ``a customer buys a black jumper`` () = ()

let [<Given>] ``I have (.*) black jumpers left in stock`` (n : int) = stockItem <- { stockItem with Count = n }

let [<When>] ``he returns the jumper for a refund`` () = stockItem <- { stockItem with Count = stockItem.Count + 1 }

let [<Then>] ``I should have (.*) black jumpers in stock`` (n : int) = stockItem.Count |> should equal n

Page 41: А нам-то зачем функциональное программирование?
Page 42: А нам-то зачем функциональное программирование?
Page 43: А нам-то зачем функциональное программирование?
Page 44: А нам-то зачем функциональное программирование?
Page 45: А нам-то зачем функциональное программирование?
Page 46: А нам-то зачем функциональное программирование?
Page 47: А нам-то зачем функциональное программирование?
Page 48: А нам-то зачем функциональное программирование?
Page 49: А нам-то зачем функциональное программирование?