Top Banner
Functional programming in Julia Julia Taiwan 發發發 發發發
58

20170317 functional programming in julia

Mar 21, 2017

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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