Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Functional Ruby
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
高見龍
June 27, 2023
Technology
400
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Functional Ruby
高見龍
June 27, 2023
More Decks by 高見龍
See All by 高見龍
宅宅自以為的浪漫:跟 AI 一起為自己辦的研討會寫一個售票系統
eddie
0
710
自己的售票系統自己做!
eddie
0
760
AI Agent 時代的開發者生存指南
eddie
4
2.9k
print("Hello, World")
eddie
2
740
為你自己學 Python - 冷知識篇
eddie
1
550
為你自己學 Python
eddie
0
860
Generative AI 年會小聚 - AI 教我寫程式
eddie
0
310
讓數據說話:用 Python、Prometheus 和 Grafana 講故事
eddie
0
830
AI 時代的程式語言學習法
eddie
0
350
Other Decks in Technology
See All in Technology
freeeにおけるSoftware Factory
freee
PRO
0
520
自宅サーバと脆弱性
masakiokuda
1
110
Filter What the LLM Reads: RAG Governance with AgentCore Gateway
yakumo
0
110
AIで選択肢が広がった組織設計の理想と現実
konifar
12
5.1k
1週間、Opus封印でお願いします
kintotechdev
0
160
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
230
Metadata - Section 2: Simple Metadata & Meta Tags
mohab1
0
140
Teaching Python with three kinds of AI
reuven
0
120
プロダクトが成長すると、 プロダクトマネージャーの仕事はどう変わるのか - 「まず作る」から「小さく学び、確かめながら進む」へ
sansantech
PRO
1
370
freeeにおける AI を用いた ブラウザ動作確認の自動化の取り組み
freee
PRO
0
220
野良MCPサーバーを排除せよ!MCPサーバーのガバナンス
yukiogawa
1
240
推論基盤と Scale-Up Interconnect の現状と制約から俯瞰する技術動向
markunet
2
150
Featured
See All Featured
A Soul's Torment
seathinner
8
3.8k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
37k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Rails Girls Zürich Keynote
gr2m
96
14k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
580
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
It's Worth the Effort
3n
188
29k
BBQ
matthewcrist
90
10k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Transcript
為你⾃⼰學 系列單元 ޒഒላӃ Functional Ruby
ޒഒላӃ വᏐࣜఔࣜઃܭ 'VODUJPOBM1SPHSBNNJOH '1
ޒഒላӃ ਞྻཫॴ༗తحᏐ ငҎ೭ޙฒܭࢉશ෦ݩૉ័
ޒഒላӃ +4 // JavaScript const list = [1, 2, 3,
4, 5] const odd_numbers = [] // 挑出奇數 for (let i = 0; i < list.length; i++) { const el = list[i] if (el % 2 === 1) { odd_numbers.push(el) } } const triple_numbers = [] // 乘 3 倍 for (let i = 0; i < odd_numbers.length; i++) { triple_numbers.push(odd_numbers[i] * 3) } let total = 0 // 計算總和 for (let i = 0; i < triple_numbers.length; i++) { total += triple_numbers[i] } console.log(total) // 27
ޒഒላӃ +4 // JavaScript const list = [1, 2, 3,
4, 5] const result = list.filter(i => i % 2 === 1) .map(i => i * 3) .reduce((acc, cv) => acc + cv, 0) console.log(result) // 27
ޒഒላӃ +4 // JavaScript const list = [1, 2, 3,
4, 5] const oddOnly = (i) => i % 2 === 1 const triple = (i) => i * 3 const sum = (acc, cv) => acc + cv const result = list.filter(oddOnly) .map(triple) .reduce(sum, 0) console.log(result) // 27
ޒഒላӃ ॄኄੋ'1ʁ
ޒഒላӃ ఔࣜޠݴయൣ 1SPHSBNNJOH1BSBEJHNT
ޒഒላӃ ݅ಋఔࣜઃܭ 0CKFDU0SJFOUFE1SPHSBNNJOH
ޒഒላӃ ෧ ঝ &ODBQTVMBUJPO*OIFSJUBODF
ޒഒላӃ വᏐࣜఔࣜઃܭ 'VODUJPOBM1SPHSBNNJOH
ޒഒላӃ വᏐ 'VODUJPO
ޒഒላӃ ॄኄੋവᏐʁ
ޒഒላӃ f(x) = 3x + 2
ޒഒላӃ വᏐ༌ೖ值ᢛ༌ग़值೭ؒత᮫
ޒഒላӃ ७വᏐ 1VSF'VODUJPO
ޒഒላӃ 1VSF'VODUJPO ༌ग़݁Ռ᪑༌ೖ值༗᮫
ޒഒላӃ +4 # 不純 def one_weeks_later Time.now + 7.days end
ޒഒላӃ +4 # 比較純 def one_weeks_later(current_time) current_time + 7.days end
ޒഒላӃ 1VSF'VODUJPO ෆ။㐫ଶվᏓ
ޒഒላӃ ᔒ༗෭࡞༻ /PTJEFFGGFDU
ޒഒላӃ +4 # 不純 def add_book Book.create(title: '為你⾃⼰學 Ruby') end
ޒഒላӃ +4 # 不純 def replace_element(arr, idx, value) arr[idx] =
value arr end list = [1, 2, 3] result = replace_element(list, 0, "a") p result # ["a", 2, 3] p list # ???
ޒഒላӃ +4 # 比較純 def replace_element(arr, idx, value) dup_arr =
arr.dup dup_arr[idx] = value dup_arr end list = [1, 2, 3] result = replace_element(list, 0, "a") p result # ["a", 2, 3] p list # ???
ޒഒላӃ ෆՄᏓੑ *NNVUBCJMJUZ
ޒഒላӃ +4 // JavaScript const list = [1, 2, 3]
const otherList = list console.log(list) // [1, 2, 3] otherList[0] = "a" console.log(list) // ???
ޒഒላӃ +4 // Rust fn main() { let list =
[1, 2, 3]; list[0] = 100; // 預設是不能修改的 println!("{:?}", list); }
ޒഒላӃ +4 # Elixir list = [1, 2, 3] list[0]
= 100 # 預設是不可修改的
ޒഒላӃ '1JO3VCZ
ޒഒላӃ +4 list = [1, 2, 3, 4, 5] double_list
= list.map { |n| 2 * n } odd_numbers = list.filter { |n| n.odd? } p double_list # [2, 4, 6, 8, 10] p odd_numbers # [1, 3, 5]
ޒഒላӃ 3VCZฒෆࢉੋਅਖ਼త'1-BOHVBHF
ޒഒላӃ വᏐੋҰެຽ 'JSTU$MBTT$JUJ[FO
ޒഒላӃ +4 // JavaScript const list = [1, 2, 3,
4, 5] const oddOnly = (i) => i % 2 === 1 const triple = (i) => i * 3 const sum = (acc, cv) => acc + cv const result = list.filter(oddOnly) .map(triple) .reduce(sum, 0) console.log(result) // 27
ޒഒላӃ 3VCZॴ༗త౦ੋ݅ &WFSZUIJOHJO3VCZJTBOPCKFDU
ޒഒላӃ ୠଖመ༗ࠣ౦ฒෆੋ݅
ޒഒላӃ ᩋํ๏ʮ݅Խʯ
ޒഒላӃ +4 # 把⽅法物件化 def add(a, b) a + b
end m1 = method(:add) m2 = Proc.new { |x, y| add(x, y) } m3 = -> (x, y) { add(x, y) } puts m1.call(1, 2) # 3 puts m2.call(3, 4) # 7 puts m3.call(5, 6) # 11
ޒഒላӃ ෆՄᏓੑ *NNVUBCJMJUZ
ޒഒላӃ +4 # Data.define 是 Ruby 3.2 之後才加進來的新功能 Location =
Data.define(:x, :y) point = Location.new(0, 0) puts point.x, point.y point.x = 100 # 錯誤
ޒഒላӃ ိᴍෳᯑత
ޒഒላӃ ᐬཬԽ $VSSZJOH
ޒഒላӃ ݪຊधཁଟݸჩᏐతവᏐ ҰܥྻཁݸჩᏐతവᏐతաఔ
ޒഒላӃ +4 def add_numbers(a, b, c) a + b +
c end # 柯⾥化 curried_add = -> (x) { -> (y) { -> (z) { add_numbers(x, y, z) } } }
ޒഒላӃ +4 # 分開寫 add_2 = curried_add.call(2) add_3 = add_2.call(3)
result = add_3.call(5) puts result # 或串在⼀起寫 puts curried_add.call(2).call(3).call(5)
ޒഒላӃ +4 def add_numbers(a, b, c) a + b +
c end # 柯⾥化 # curried_add = -> (x) { # -> (y) { # -> (z) { # add_numbers(x, y, z) # } # } # } # Ruby 內建的⽅法 curried_add = method(:add_numbers).curry
ޒഒላӃ ภവᏐ 1BSUJBM'VODUJPOT
ޒഒላӃ ෦份BQQMZݪ࢝വᏐɼઌݻఆവᏐత෦ ჩᏐɼճၚडႫᰨჩᏐత৽വᏐ
ޒഒላӃ +4 def add_numbers(a, b, c) a + b +
c end # Partial Function # 先給 1 個參數 add_2 = -> (i, j) { add_numbers(2, i, j) } # 剩下的 2 個參數之後再⼀次給⾜ puts add_2.call(3, 5) # 10
ޒഒላӃ +4 def add_numbers(a, b, c) a + b +
c end # Partial Function # 或是先給 2 個參數 add_2_and_3 = -> (k) { add_numbers(2, 3, k) } # 最後 1 個參數之後再給 puts add_2_and_3.call(5) # 10
ޒഒላӃ +4 def add_numbers(a, b, c) a + b +
c end # 利⽤內建的 curry ⽅法 partial_fn = method(:add_numbers).curry # 先給 1 個參數 add_2 = partial_fn.call(2) # 剩下的參數之後再⼀次給⾜ puts add_2.call(3, 5) # 10
ޒഒላӃ വᏐ߹ 'VODUJPO$PNQPTJUJPO
ޒഒላӃ ઌՃɼ࠶Ճഒɼ࠷ޙ࠶ฏํʂ
ޒഒላӃ +4 // JavaScript const add_one = (n) => n
+ 1 const double = (n) => n * 2 const square = (n) => n * n console.log(square(double(add_one(5)))) // 144
ޒഒላӃ ઢ 1JQF
ޒഒላӃ +4 # Elixir add_one = fn x -> x
+ 1 end double = fn x -> x * 2 end square = fn x -> x * x end result = 5 |> add_one.() |> double.() |> square.() IO.inspect result # 144
ޒഒላӃ 3VCZᔒ༗Ṝኄํศత౦
ޒഒላӃ +4 add_one = -> (n) { n + 1
} double = -> (n) { n * 2 } square = -> (n) { n * n } # 先加 1,再加倍,最後再平⽅ composed_fn = add_one.compose(double) .compose(square) puts composed_fn.call(5) # 144
ޒഒላӃ +4 add_one = -> (n) { n + 1
} double = -> (n) { n * 2 } square = -> (n) { n * n } # 先加 1,再加倍,最後再平⽅ composed_fn = add_one >> double >> square puts composed_fn.call(5) # 144
ޒഒላӃ