Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Functional Programming and Ruby - EuRuKo
Search
Pat Shaughnessy
June 28, 2013
Technology
2
770
Functional Programming and Ruby - EuRuKo
Slides from Athens, June 2013
Pat Shaughnessy
June 28, 2013
Tweet
Share
More Decks by Pat Shaughnessy
See All by Pat Shaughnessy
20000 Leagues Under ActiveRecord
pat_shaughnessy
0
120
Visualizing Garbage Collection in Rubinius, JRuby and Ruby 2.0
pat_shaughnessy
8
710
Functional Programming and Ruby
pat_shaughnessy
6
1.5k
Dissecting a Ruby Block
pat_shaughnessy
10
440
Other Decks in Technology
See All in Technology
TROCCO今昔
gtnao
0
200
Shadow DOMとセキュリティ - 光と影の境界を探る / Shibuya.XSS techtalk #13
masatokinugawa
0
250
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.7k
Webの技術とガジェットで那須の子ども達にワクワクを! / IoTLT_20250720
you
PRO
0
120
SREを知らずに SREマネージャーになった話 / How I Became an SRE Manager Without Knowing What SRE Is
moneyforward
0
260
Jitera Company Deck / JP
jitera
0
120
分散トレーシングによる コネクティッドカーのデータ処理見える化の試み
thatsdone
0
150
PHPからはじめるコンピュータアーキテクチャ / From Scripts to Silicon: A Journey Through the Layers of Computing
tomzoh
2
370
「現場で活躍するAIエージェント」を実現するチームと開発プロセス
tkikuchi1002
6
960
LIXIL基幹システム刷新に立ち向かう技術的アプローチについて
tsukuha
1
1.1k
Bliki (ja), and the Cathedral, and the Bazaar
koic
7
1.1k
データエンジニアリング 4年前と変わったこと、 4年前と変わらないこと
tanakarian
2
340
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Raft: Consensus for Rubyists
vanstee
140
7k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Adopting Sorbet at Scale
ufuk
77
9.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
How to Ace a Technical Interview
jacobian
278
23k
Gamification - CAS2011
davidbonilla
81
5.4k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Building an army of robots
kneath
306
45k
Faster Mobile Websites
deanohume
308
31k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
282
13k
Transcript
foo :: Ord a => [a] -> [a] foo []
= [] foo (p:xs) = (foo lesser) ++ [p] ++ (foo greater) where lesser = filter (< p) xs greater = filter (>= p) xs
None
Ruby is a language designed in the following steps: *
take a simple lisp language * add blocks, inspired by higher order functions * add methods found in Smalltalk * add functionality found in Perl So, Ruby was a Lisp originally, in theory. Let's call it MatzLisp from now on. ;-) ! ! ! ! ! ! ! matz.
None
None
None
None
Haskell... is a polymorphically statically typed, lazy, purely functional language,
quite different from most other programming languages. The language is named for Haskell Brooks Curry, ...
- what is “functional programming?” - higher order functions -
lazy evaluation - memoization
None
higher order functions
[1..10] =>[1, 2, 3, 4, 5, 6, 7, 8, 9,
10] (1..10).to_a
[ x*x | x <- [1..10]] (1..10).collect { |x| x*x
} =>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] (1..10).map { |x| x*x }
None
map (\x -> x*x) [1..10] (1..10).map &lambda { |x| x*x
} =>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] (1..10).map &(->(x) { x*x })
lazy evaluation
[1..] =>[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28, 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54, 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80, 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,1 05,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, etc...
take 10 [1..] =>[1,2,3,4,5,6,7,8,9,10]
take 10 [ x+1 | x <- [ x*x |
x <- [1..]]] =>[2,5,10,17,26,37,50,65,82,101]
(1..Float::INFINITY) .lazy .collect { |x| x*x } .collect { |x|
x+1 } .take(10).force =>[2,5,10,17,26,37,50,65,82,101]
=>[2,5,10,17,26,37,50,65,82,101] (1..Float::INFINITY) .lazy .collect { |x| x*x } .collect {
|x| x+1 } .first(10)
(1..10).collect { |x| x*x } each Range Enumerable #collect Enumerable#collect
enum = Enumerator.new do |y| y.yield 1 y.yield 2 end
p enum.collect { |x| x*x } => [1, 4] Enumerator
enum = Enumerator.new do |y| y.yield 1 y.yield 2 end
enum.collect do |x| x*x end
Enumerator Yielder yields Generator do |y| y.yield 1 y.yield 2
end
Enumerator::Lazy calls each yields Enumerator::Lazy calls each yields my block
my block yields yields
=>[2,5,10,17,26,37,50,65,82,101] (1..Float::INFINITY) .lazy .collect { |x| x*x } .collect {
|x| x+1 } .first(10)
Step 1: Call "each" Lazy Lazy x*x x+1 yield yield
Infinite range first(10) Step 2: yield to the blocks, one at a time
memoization
slow_fib 0 = 0 slow_fib 1 = 1 slow_fib n
= slow_fib (n-2) + slow_fib (n-1) map slow_fib [1..10] => [1,1,2,3,5,8,13,21,34,55] http://www.haskell.org/haskellwiki/Memoization
None
memoized_fib = (map fib [0 ..] !!) where fib 0
= 0 fib 1 = 1 fib n = memoized_fib (n-2) + memoized_fib (n-1) Typical Haskell magic! http://www.haskell.org/haskellwiki/Memoization
(map fib [0 ..] !!) Infinite, lazy list of return
values A curried function to return the requested fib
[0 ..] (0..Float::INFINITY)
map fib [0 ..] (0..Float::INFINITY) .lazy.map {|x| fib(x) }
(map fib [0 ..] !!) cache = (0..Float::INFINITY) .lazy.map {|x|
fib(x) } nth_element_from_list = lambda { |ary, n| ary[n]} nth_fib = nth_element_from_list.curry[cache]
map memoized_fib [1..10] => [1,1,2,3,5,8,13,21,34,55] `block in <main>': undefined method
`[]' for #<Enumerator::Lazy: #<Enumerator::Lazy: 0..Infinity>:map> (NoMethodError)
each Range Enumerable #collect (0..Float::INFINITY) .lazy.map {|x| fib(x) } nth_element_from_list
= lambda { |ary, n| ary[n]}
@cache = {} @cache[1] = 1 @cache[2] = 1 def
memoized_fib(n) @cache[n] ||= memoized_fib(n-1) + memoized_fib(n-2) end
learn by studying other languages... and acquire a different perspective
on Ruby
Ruby has many functional features, but is not a functional
language