20170317 functional programming in julia

58
Functional programming in Julia Julia Taiwan 發發發 發發發

Upload: -

Post on 21-Mar-2017

119 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: 20170317 functional programming in julia

Functional programming in JuliaJulia Taiwan 發起人 杜岳華

Page 2: 20170317 functional programming in julia

讓我們來談談 programming

Page 3: 20170317 functional programming in julia

Imperative programming ( 指令式 )•How to achieve the goal

Sequential Looping Condition Function

Page 4: 20170317 functional programming in julia

Declarative programming ( 宣告式 )•What we want to achieve

Page 5: 20170317 functional programming in julia

Functional programming•What we want to achieve

FunctionFunction FunctionFunction

Page 6: 20170317 functional programming in julia

Function is from math

Page 7: 20170317 functional programming in julia

Function is from math

Page 8: 20170317 functional programming in julia

Function is from math

Page 9: 20170317 functional programming in julia

Function is from math

Page 10: 20170317 functional programming in julia

What does it do?…01234…

…-10123…

f

Page 11: 20170317 functional programming in julia

add_one[int]

01234…

[int]-10123…

f

Page 12: 20170317 functional programming in julia

Function is mapping[int]

01234…

[int]-10123…

f

Page 13: 20170317 functional programming in julia

Function is mapping[int]

01234…

[int]-10123…

if x == -1 return 0elseif x == 0 return 1elseif x == 1 return 2elseif x == 2 return 3elseif x == 3 return 4

Page 14: 20170317 functional programming in julia

Function is mapping

[Name]AliceBobChrisDavidEve…

[Customer]

Cus1Cus2Cus3Cus4Cus5

if x == Cus1 return “Alice”elseif x == Cus2 return “Bob”elseif x == Cus3 return “Chris”elseif x == Cus4 return “David”elseif x == Cus5 return “Eve”

Page 15: 20170317 functional programming in julia

Pure function is good

Page 16: 20170317 functional programming in julia

Impure• May change the global state (variable)

file = “/path/to/file”

function read_file() f = open(file) return readlines(f)end

read_file()

Page 17: 20170317 functional programming in julia

Pure• No side effect

function read_file(file) f = open(file) return readlines(f)end

filename = “/path/to/file”read_file(filename)

Page 18: 20170317 functional programming in julia

Impure• There are hidden and mutable states (variables) inside

the class• Sometimes, it is difficult to reason about.

customer.setName(newName)name = customer.getName()

Page 19: 20170317 functional programming in julia

Pure• Good to reason about

newCustomer = setCustomerName(aCustomer, newName)name = getCustomerName(aCustomer)

Page 20: 20170317 functional programming in julia

More practical benefits• Laziness

• Cacheable results

• No order dependencies

• Easy to parallelize

Page 21: 20170317 functional programming in julia

Types are not class

Page 22: 20170317 functional programming in julia

Types are not class

Page 23: 20170317 functional programming in julia

Types are not class[int]

0123…

[int]-1012… These are types.

“int” is type.“Customer” is type.“Function” is also type.

Page 24: 20170317 functional programming in julia

Types separate data from behavior

DataBehavior

Page 25: 20170317 functional programming in julia

Types are not class• Types are cheap and classes are expensive!• Types are static and classes are dynamic.

• Julia use Type, not Class.• One can perform object-oriented design in Julia and

easily write it in functional style.

Page 26: 20170317 functional programming in julia

Functions are things

Page 27: 20170317 functional programming in julia

Functions are things

f

Page 28: 20170317 functional programming in julia

Functions are things• Function as input

fg

Page 29: 20170317 functional programming in julia

Functions are things• Function as output

f g

Page 30: 20170317 functional programming in julia

Functions are things• Function as parameter

fg

Page 31: 20170317 functional programming in julia

Lambda expression (function)• Anonymous function• Function as first-class citizen

() -> println()

x -> x + 5

(x, y, z) -> x + y + z

func = x -> x * 2

Page 32: 20170317 functional programming in julia

First-class citizen• 可以被指定給變數• 可以存在 expression 內• 可以以參數的方式指定給 function• 可以以回傳值的方式由 function 回傳• Second-class• 可以如同 function (operator) 般被呼叫• 可以以參數的方式指定給 function

Page 33: 20170317 functional programming in julia

Higher-order function

• 那我們就可以做點有趣的事 !

Page 34: 20170317 functional programming in julia

Higher-order function• map

numbers = [1, 2, 3, 4]results = map(x -> x + 5, numbers)

numbers = [1, 2, 3, 4]results = []for i=numbers append!(results, i + 5)end

Page 35: 20170317 functional programming in julia

Higher-order function

1234

numbers map x -> x + 5

Page 36: 20170317 functional programming in julia

Higher-order function

1234

numbers resultsmap

x -> x + 5

Page 37: 20170317 functional programming in julia

Higher-order function

1234

numbers

6789

resultsmap

x -> x + 5

Page 38: 20170317 functional programming in julia

Higher-order function

map

Page 39: 20170317 functional programming in julia

Higher-order function

map

Page 40: 20170317 functional programming in julia

Higher-order function

map

Page 41: 20170317 functional programming in julia

Higher-order function• filter

numbers = [1, 2, 3, 4]results = filter(x -> x > 2, numbers)

numbers = [1, 2, 3, 4]results = []for i=numbers if i > 2 append!(results, i) endend

Page 42: 20170317 functional programming in julia

Higher-order function

1234

numbers

34

resultsfilter

x -> x > 2

Page 43: 20170317 functional programming in julia

Higher-order function

1234

numbers

10

resultreduce

(x, y) -> x + y

Page 44: 20170317 functional programming in julia

Higher-order function

1234

numbersreduce

(x, y) -> x + y 334

reduce

(x, y) -> x + y 64

Page 45: 20170317 functional programming in julia

Higher-order function

10

result

reduce

(x, y) -> x + y64

Page 46: 20170317 functional programming in julia

More higher-order functions• foldl(op, iter)• foldr(op, iter)• sum(f, iter)• count(f, iter)• any(f, iter)• all(f, iter)• foreach(f, iter)• mapreduce, mapfoldl, mapfoldr

Page 47: 20170317 functional programming in julia

Function composition

Page 48: 20170317 functional programming in julia

Function composition

f

𝑓 ∘𝑔 (𝑥 )

g

Page 49: 20170317 functional programming in julia

gf

Page 50: 20170317 functional programming in julia

Function composition

f ∘ g

Page 51: 20170317 functional programming in julia

Function composition

map

x -> x + 3

filter

x -> x > 2

Page 52: 20170317 functional programming in julia

Function composition

numbers = [1, 2, 3, 4]results = filter(x -> x > 2, map(x -> x + 3, numbers))

Page 53: 20170317 functional programming in julia

More functional properties• Recursion is better than iteration• Relies on the language design

• Lazy evaluation• Use Task to help you.

• Closure• OK

• Curry• OK

• Pattern matching• use multiple dispatch in Julia

Page 54: 20170317 functional programming in julia

Pipeline?

map

x -> x + 3

filter

x -> x > 2

reduce

(x, y) ->x + y

Page 55: 20170317 functional programming in julia

Reactive programming in Python

source = [1, 2, 3, 4, 5, 6, 7, 8]result = Observable.from(source) .map(lambda x: x ** 2) .filter(lambda x: x > 20) .reduce(lambda x, y: x+y) .subscribe()

Page 56: 20170317 functional programming in julia

Reactive programming

Page 57: 20170317 functional programming in julia

Reactive programming in Julia• Reactive.jl

• I hope…source = [1, 2, 3, 4, 5, 6, 7, 8]result = from(source) (map, x -> x ^ 2) (filter, x -> x > 20) (reduce, (x, y) -> x + y) (subscribe)

Page 58: 20170317 functional programming in julia

Thank you for attention