• Like
  • Save

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Dont Drive on the Railroad Tracks

  • 765 views
Published

 

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
765
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Don’t Drive on the Railroad Tracks Eugene Wallingford University of Northern Iowa November 17, 2010 Thursday, November 18, 2010
  • 2. Two Claims 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. 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. end X def addSalesTax( price ) price = price * 1.07 Thursday, November 18, 2010
  • 7. def addSalesTax( price ) tax = price * 0.07 price = price + tax end Thursday, November 18, 2010
  • 8. X def addSalesTax( price ) tax = price * 0.07 price = price + tax end Thursday, November 18, 2010
  • 9. side effects Thursday, November 18, 2010
  • 10. X side effects 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(“-l”, uniq(“-d”, sort(“-m”, 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 ] ^2 ^2 ^2 ^2 [ 1 , 4 , 9 , 16 ] Thursday, November 18, 2010
  • 33. [ 1 , 2 , 3 , 4 ] 1 + 2 + 3 + 4 => 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 first-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] } make a list of each item [[8], [4], [1], [6], [7], [2], [5], [3]] 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) && 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) && { a_table.label => widget.send(a_table.widgets_column_name) } || {} } .inject(&:merge) Thursday, November 18, 2010
  • 71. Combinators in Action suppose we want to find 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(&:odd?) Thursday, November 18, 2010
  • 74. (1..100).select(&:odd?).inject(&:+) Thursday, November 18, 2010
  • 75. lambda { |x| x * x }.call( (1..100).select(&:odd?).inject(&:+)) Thursday, November 18, 2010
  • 76. lambda { |x| x * x }.call( (1..100).select(&:odd?).inject(&:+)) 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(&:odd?).inject(&:+) .callWithSelf(lambda { |x| x * x }) Thursday, November 18, 2010
  • 79. (1..100).select(&:odd?).inject(&:+) .into (lambda { |x| x * x }) Thursday, November 18, 2010
  • 80. (1..100) .select(&:odd?) .inject(&:+) .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 => B): B = { g(x) } } Thursday, November 18, 2010
  • 84. Thrush((1 to 100) .filter(_ % 2 != 0) .foldLeft(0)(_ + _)) .into((x: Int) => x * x) Thursday, November 18, 2010
  • 85. accounts .filter(_ belongsTo "John S.") .map(_.calculateInterest) .filter(_ > threshold) .foldLeft(0)(_ + _) .into {x: Int => 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’t all this recursion so inefficient 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. <Scheme indulgence> Thursday, November 18, 2010
  • 101. def factorial(n: Int) = { def loop(n: Int, acc: Int): Int = if (n <= 0) acc else loop(n - 1, acc * n) loop(n, 1) } Thursday, November 18, 2010
  • 102. return ’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 finished, not the world in which it was started. Ray Kurzweil Thursday, November 18, 2010
  • 105. resources to study 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/ Thursday, November 18, 2010