0
Upcoming SlideShare
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Standard text messaging rates apply

Dont Drive on the Railroad Tracks

810

Published on

Published in: Technology
2 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
Your message goes here
• Be the first to comment

Views
Total Views
810
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
0
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript

• 1. Don&#x2019;t Drive on the Railroad Tracks Eugene Wallingford University of Northern Iowa November 17, 2010 Thursday, November 18, 2010
• 2. In the small, you know this. It is no big deal. In the large, this is different. It changes how you think about problems and data. Two Claims Thursday, November 18, 2010
• 3. you know this Thursday, November 18, 2010
• 4. def addSalesTax( price ) price * 1.07 end Thursday, November 18, 2010
• 5. def addSalesTax( price ) price = price * 1.07 end Thursday, November 18, 2010
• 6. def addSalesTax( price ) price = price * 1.07 end X Thursday, November 18, 2010
• 7. def addSalesTax( price ) tax = price * 0.07 price = price + tax end Thursday, November 18, 2010
• 8. def addSalesTax( price ) tax = price * 0.07 price = price + tax end X Thursday, November 18, 2010
• 9. side effects Thursday, November 18, 2010
• 10. side effectsX Thursday, November 18, 2010
• 11. Thursday, November 18, 2010
• 12. Thursday, November 18, 2010
• 13. Thursday, November 18, 2010
• 14. def addSalesTax( price ) price * 1.07 end Thursday, November 18, 2010
• 15. sort -m access01-ips access02-ips | uniq -d | wc -l Thursday, November 18, 2010
• 16. wc(&#x201C;-l&#x201D;, uniq(&#x201C;-d&#x201D;, sort(&#x201C;-m&#x201D;, access01-ips, access02-ips))) Thursday, November 18, 2010
• 17. [ 1 , 2 , 3 , 4 ] ["a","b","c","d"] Thursday, November 18, 2010
• 18. [ 1 , 2 , 3 , 4 ] ["a","b","c","d"] Thursday, November 18, 2010
• 19. [ 1 , 2 , 3 , 4 ]. zip( ["a","b","c","d"] ) Thursday, November 18, 2010
• 20. [[1, "a"], [2, "b"], [3, "c"], [4, "d"]] Thursday, November 18, 2010
• 21. [ 1 , 2 , 3 , 4 ] { |x| x.odd? } Thursday, November 18, 2010
• 22. [ 1 , 2 , 3 , 4 ] [ 1 , 3 ] Thursday, November 18, 2010
• 23. [ 1 , 2 , 3 , 4 ]. select { |x| x.odd? } Thursday, November 18, 2010
• 24. [ 1, 3 ] Thursday, November 18, 2010
• 25. [ 1 , 2 , 3 , 4 ] { |x| x.odd? } Thursday, November 18, 2010
• 26. [ 1 , 2 , 3 , 4 ] [ 1 , 2 , 3 , 4 ] Thursday, November 18, 2010
• 27. [ 1 , 2 , 3 , 4 ]. partition { |x| x.odd? } Thursday, November 18, 2010
• 28. [ [ 1, 3 ], [ 2, 4 ] ] Thursday, November 18, 2010
• 29. [ 1 , 2 , 3 , 4 ] { |x| x * x } Thursday, November 18, 2010
• 30. [ 1 , 2 , 3 , 4 ] [ 1 , 4 , 9 , 16 ] Thursday, November 18, 2010
• 31. [ 1 , 2 , 3 , 4 ]. map { |x| x * x } Thursday, November 18, 2010
• 32. [ 1 , 2 , 3 , 4 ] [ 1 , 4 , 9 , 16 ] ^2^2^2^2 Thursday, November 18, 2010
• 33. [ 1 , 2 , 3 , 4 ] 1 + 2 + 3 + 4 =&gt; 10 Thursday, November 18, 2010
• 34. 1 + 2 + 3 + 4 == ((1 + 2) + 3) + 4 Thursday, November 18, 2010
• 35. [ 1 , 2 , 3 , 4 ]. inject { |x,y| x + y } Thursday, November 18, 2010
• 36. [ 1 , 2 , 3 , 4 ]. inject { |x,y| x + y } fold the list with + Thursday, November 18, 2010
• 37. { |x| x.odd? } { |x| x * x } { |x,y| x + y } Thursday, November 18, 2010
• 38. functions are &#xFB01;rst-class values Thursday, November 18, 2010
• 39. # Python for item in iterable_collection: # do something with item # Ruby set.each do |item| # do something with item end Thursday, November 18, 2010
• 40. next steps Thursday, November 18, 2010
• 41. implies recursion over persistent data structures Thursday, November 18, 2010
• 42. number ::= 0 | 1 + number Thursday, November 18, 2010
• 43. list ::= empty | item + list Thursday, November 18, 2010
• 44. tree ::= empty | item + tree + tree Thursday, November 18, 2010
• 45. induction implies recursion Thursday, November 18, 2010
• 46. what versus how Thursday, November 18, 2010
• 47. number ::= 0 | 1 + number if n = 0 do something else solve for 1 solve for n-1 combine Thursday, November 18, 2010
• 48. number ::= 0 | 1 + number Thursday, November 18, 2010
• 49. number ::= 0 | 1 + number decrease and conquer Thursday, November 18, 2010
• 50. number ::= 0 | 1 + number sequential Thursday, November 18, 2010
• 51. number ::= 0 | number/2 + number/2 Thursday, November 18, 2010
• 52. number ::= 0 | number/2 + number/2 divide and conquer Thursday, November 18, 2010
• 53. number ::= 0 | number/2 + number/2 parallel Thursday, November 18, 2010
• 54. tree ::= empty | item + tree + tree divide and conquer parallel Thursday, November 18, 2010
• 55. MapReduce map an operator over each item reduce (fold) the resulting list Thursday, November 18, 2010
• 56. [ 8, 4, 1, 6, 7, 2, 5, 3 ] [ 1, 2, 3, 4, 5, 6, 7, 8 ] Thursday, November 18, 2010
• 57. [ 8, 4, 1, 6, 7, 2, 5, 3 ]. map { |x| [x] } [[8], [4], [1], [6], [7], [2], [5], [3]] make a list of each item Thursday, November 18, 2010
• 58. [[8], [4], [1], [6], [7], [2], [5], [3]]. inject { |x,y| merge(x,y) } merge the sorted lists, pairwise [ 1, 2, 3, 4, 5, 6, 7, 8 ] Thursday, November 18, 2010
• 59. [ 8, 4, 1, 6, 7, 2, 5, 3 ] .map { |x| [x] } .inject { |x,y| merge(x,y) } map/reduce [ 1, 2, 3, 4, 5, 6, 7, 8 ] Thursday, November 18, 2010
• 60. Implications for Parallelism merge(a,b) == merge(b,a) &amp;&amp; merge(a, merge(b,c)) == merge(merge(a, b),c) merges can be done independently Thursday, November 18, 2010
• 61. Thursday, November 18, 2010
• 62. really getting it Thursday, November 18, 2010
• 63. class Proc def self.compose(f, g) lambda { |*args| f[g[*args]] } end end Thursday, November 18, 2010
• 64. class Proc def self.compose(f, g) lambda { |*args| f[g[*args]] } end end Thursday, November 18, 2010
• 65. class Proc def self.compose(f, g) lambda { |*args| f[g[*args]] } end end Thursday, November 18, 2010
• 66. class Proc def self.compose(f, g) lambda { |*args| f[g[*args]] } end end combinator Thursday, November 18, 2010
• 67. A combinator is a function that takes functions as input and computes its result by composing those functions. * * and nothing else. There are no free variables. Thursday, November 18, 2010
• 68. combinator is to functional programming as framework is to object-oriented programming Thursday, November 18, 2010
• 69. combinator is to functional programming as framework is to object-oriented programming the next level of abstraction Thursday, November 18, 2010
• 70. A Common Pattern... widget.collection .select { |a_table| a_table.widgets_column_name =~ regex } .map { |a_table| widget.attribute_present?(a_table.widgets_column_name) &amp;&amp; { a_table.label =&gt; widget.send(a_table.widgets_column_name) } || {} } .inject(&amp;:merge) Thursday, November 18, 2010
• 71. Combinators in Action suppose we want to &#xFB01;nd the square of the sum of all the odd numbers between 1 and 100 Thursday, November 18, 2010
• 72. (1..100) Thursday, November 18, 2010
• 73. (1..100).select(&amp;:odd?) Thursday, November 18, 2010
• 74. (1..100).select(&amp;:odd?).inject(&amp;:+) Thursday, November 18, 2010
• 75. lambda { |x| x * x }.call( (1..100).select(&amp;:odd?).inject(&amp;:+)) Thursday, November 18, 2010
• 76. lambda { |x| x * x }.call( (1..100).select(&amp;:odd?).inject(&amp;:+)) Thursday, November 18, 2010
• 77. A permuting combinator composes two functions in reverse order. Instead of f(g(x), we want g(f(x)). Thursday, November 18, 2010
• 78. (1..100).select(&amp;:odd?).inject(&amp;:+) .callWithSelf(lambda { |x| x * x }) Thursday, November 18, 2010
• 79. (1..100).select(&amp;:odd?).inject(&amp;:+) .into (lambda { |x| x * x }) Thursday, November 18, 2010
• 80. (1..100) .select(&amp;:odd?) .inject(&amp;:+) .into(lambda { |x| x * x }) Thursday, November 18, 2010
• 81. class Object def into expr = nil expr.nil? ? yield(self) : expr.to_proc.call(self) end end Thursday, November 18, 2010
• 82. Um, what about Scala? Thursday, November 18, 2010
• 83. case class Thrush[A](x: A) { def into[B](g: A =&gt; B): B = { g(x) } } Thursday, November 18, 2010
• 84. Thrush((1 to 100) .filter(_ % 2 != 0) .foldLeft(0)(_ + _)) .into((x: Int) =&gt; x * x) Thursday, November 18, 2010
• 85. accounts .filter(_ belongsTo "John S.") .map(_.calculateInterest) .filter(_ &gt; threshold) .foldLeft(0)(_ + _) .into {x: Int =&gt; updateBooks journalize (Ledger.INTEREST, x) } Thursday, November 18, 2010
• 86. Thursday, November 18, 2010
• 87. more? Thursday, November 18, 2010
• 88. functional design patterns Structural Recursion Thursday, November 18, 2010
• 89. functional design patterns Structural Recursion Interface Procedure Thursday, November 18, 2010
• 90. functional design patterns Structural Recursion Interface Procedure Mutual Recursion Thursday, November 18, 2010
• 91. functional design patterns Structural Recursion Interface Procedure Mutual Recursion Accumulator Passing Thursday, November 18, 2010
• 92. functional design patterns Structural Recursion Interface Procedure Mutual Recursion Accumulator Passing Local Procedure Thursday, November 18, 2010
• 93. functional design patterns Structural Recursion Interface Procedure Mutual Recursion Accumulator Passing Local Procedure Program Derivation Thursday, November 18, 2010
• 94. functional design patterns Structural Recursion Interface Procedure Mutual Recursion Accumulator Passing Local Procedure Program Derivation Tail-Recursive State Machine Continuation Passing Control Abstraction Thursday, November 18, 2010
• 95. Isn&#x2019;t all this recursion so inef&#xFB01;cient as to be impractical? Thursday, November 18, 2010
• 96. This is the 21st century. Thursday, November 18, 2010
• 97. garbage collection Thursday, November 18, 2010
• 98. tail-call elimination Thursday, November 18, 2010
• 99. def foo(...) = { if (n is base case) return some value else foo(...) } Thursday, November 18, 2010
• 100. &lt;Scheme indulgence&gt; Thursday, November 18, 2010
• 101. def factorial(n: Int) = { def loop(n: Int, acc: Int): Int = if (n &lt;= 0) acc else loop(n - 1, acc * n) loop(n, 1) } Thursday, November 18, 2010
• 102. return &#x2019;done Thursday, November 18, 2010
• 103. If I had asked people what they wanted, they would have said 'faster horses'. Henry Ford Thursday, November 18, 2010
• 104. An invention has to make sense in the world in which it is &#xFB01;nished, not the world in which it was started. Ray Kurzweil Thursday, November 18, 2010
• 105. http://www.youtube.com/watch?v=c_5GpBgsang http://weblog.raganwald.com/2008/01/no-detail-too-small.html http://debasishg.blogspot.com/2009/09/thrush-combinator-in-scala.html http://fupeg.blogspot.com/2009/04/tail-recursion-in-scala.html http://www.cs.uni.edu/~wallingf/patterns/recursion.html http://www.cs.uni.edu/~wallingf/patterns/envoy.pdf http://mitpress.mit.edu/sicp/ http://sicpinclojure.com/ resources to study Thursday, November 18, 2010