Top Banner
FUNCTIONAL RUBY
67

Funtional Ruby - Mikhail Bortnyk

Jan 07, 2017

Download

Technology

Ruby Meditation
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: Funtional Ruby - Mikhail Bortnyk

FUNCTIONAL RUBY

Page 2: Funtional Ruby - Mikhail Bortnyk
Page 3: Funtional Ruby - Mikhail Bortnyk

ABOUT ME

• Mikhail Bortnyk

Page 4: Funtional Ruby - Mikhail Bortnyk

ABOUT ME

• Mikhail Bortnyk

• Too old for this shit

Page 5: Funtional Ruby - Mikhail Bortnyk

ABOUT ME

• Mikhail Bortnyk

• Too old for this shit

• Work for Amoniac OÜ

Page 6: Funtional Ruby - Mikhail Bortnyk

ABOUT ME

• Mikhail Bortnyk

• Too old for this shit

• Work for Amoniac OÜ

• Ruby developer

Page 7: Funtional Ruby - Mikhail Bortnyk

ABOUT ME

• Mikhail Bortnyk

• Too old for this shit

• Work for Amoniac OÜ

• Ruby developer

• Language researcher

Page 8: Funtional Ruby - Mikhail Bortnyk

ABOUT ME

• Mikhail Bortnyk

• Too old for this shit

• Work for Amoniac OÜ

• Ruby developer

• Language researcher

• kottans.org co-founder

Page 9: Funtional Ruby - Mikhail Bortnyk

ABOUT ME

• Mikhail Bortnyk

• Too old for this shit

• Work for Amoniac OÜ

• Ruby developer

• Language researcher

• kottans.org co-founder

• twitter @mikhailbortnyk

Page 10: Funtional Ruby - Mikhail Bortnyk

LOOK FOR JACKIE*

SPECIAL OFFER

*НАЕБЫВАЮ

Page 11: Funtional Ruby - Mikhail Bortnyk

PART ONE WHY FUNCTIONAL?

Page 12: Funtional Ruby - Mikhail Bortnyk

SIDE EFFECTS

PROBLEM 1.1

• your objects store state

Page 13: Funtional Ruby - Mikhail Bortnyk

SIDE EFFECTS

PROBLEM 1.1

• your objects store state

• your code modifies state

Page 14: Funtional Ruby - Mikhail Bortnyk

SIDE EFFECTS

PROBLEM 1.1

• your objects store state

• your code modifies state

• your other code modifies state too

Page 15: Funtional Ruby - Mikhail Bortnyk

SIDE EFFECTS

PROBLEM 1.1

• your objects store state

• your code modifies state

• your other code modifies state too

• summary: mess

Page 16: Funtional Ruby - Mikhail Bortnyk

SIDE EFFECTS

PROBLEM 1.1

• your objects store state

• your code modifies state

• your other code modifies state too

• summary: mess

Page 17: Funtional Ruby - Mikhail Bortnyk

DATA/CODE ENTITY SHARING

PROBLEM 1.2

• your model stores both your logic and data

Page 18: Funtional Ruby - Mikhail Bortnyk

DATA/CODE ENTITY SHARING

PROBLEM 1.2

• your model stores both your logic and data

• nuff said

Page 19: Funtional Ruby - Mikhail Bortnyk

DATA/CODE ENTITY SHARING

PROBLEM 1.2

• your model stores both your logic and data

• nuff said

Page 20: Funtional Ruby - Mikhail Bortnyk

HYPE

PROBLEM 1.3

• Erlang

Page 21: Funtional Ruby - Mikhail Bortnyk

HYPE

PROBLEM 1.3

• Erlang

• Haskell

Page 22: Funtional Ruby - Mikhail Bortnyk

HYPE

PROBLEM 1.3

• Erlang

• Haskell

• Scala

Page 23: Funtional Ruby - Mikhail Bortnyk

HYPE

PROBLEM 1.3

• Erlang

• Haskell

• Scala

• OCaml

Page 24: Funtional Ruby - Mikhail Bortnyk

HYPE

PROBLEM 1.3

• Erlang

• Haskell

• Scala

• OCaml

• Lisp

Page 25: Funtional Ruby - Mikhail Bortnyk

HYPE

PROBLEM 1.3

• Erlang

• Haskell

• Scala

• OCaml

• Lisp

• Javascript (sic!)

Page 26: Funtional Ruby - Mikhail Bortnyk

HYPE

PROBLEM 1.3

• Erlang

• Haskell

• Scala

• OCaml

• Lisp

• Javascript (sic!)

• Ruby (sic!)

Page 27: Funtional Ruby - Mikhail Bortnyk

PART TWO EASY (NOT REALLY) LEVEL

Page 28: Funtional Ruby - Mikhail Bortnyk

LIMITS ARE FREEING

CLEAN YOUR RUBY

• David Copeland article “Adventures in functional programming with Ruby”

Page 29: Funtional Ruby - Mikhail Bortnyk

LIMITS ARE FREEING

CLEAN YOUR RUBY

• David Copeland article “Adventures in functional programming with Ruby”

• Loops are just functions

Page 30: Funtional Ruby - Mikhail Bortnyk

LIMITS ARE FREEING

CLEAN YOUR RUBY

• David Copeland article “Adventures in functional programming with Ruby”

• Loops are just functions

• Data structures are just functions

Page 31: Funtional Ruby - Mikhail Bortnyk

LIMITS ARE FREEING

CLEAN YOUR RUBY

• David Copeland article “Adventures in functional programming with Ruby”

• Loops are just functions

• Data structures are just functions

• Objects are just functions

Page 32: Funtional Ruby - Mikhail Bortnyk

LIMITS ARE FREEING

CLEAN YOUR RUBY

• David Copeland article “Adventures in functional programming with Ruby”

• Loops are just functions

• Data structures are just functions

• Objects are just functions

• Namespaces are just functions

Page 33: Funtional Ruby - Mikhail Bortnyk

LIMITS ARE FREEING

CLEAN YOUR RUBY

• David Copeland article “Adventures in functional programming with Ruby”

• Loops are just functions

• Data structures are just functions

• Objects are just functions

• Namespaces are just functions

• P.S. Ruby HAS Tail Call Optimization

Page 34: Funtional Ruby - Mikhail Bortnyk

ROUGH HACK

TAIL-CALL OPTIMIZATION

def fact(n, acc=1) return acc if n <= 1 fact(n-1, n*acc) end

RubyVM::InstructionSequence.compile_option = { tailcall_optimization: true, trace_instruction: false }

fact(1000)

Page 35: Funtional Ruby - Mikhail Bortnyk

FUNCTIONAL VS OBJECT-ORIENTED

SIDE TO SIDE COMPARISON

new_person = ->(name, birthdate, gender, title, id=nil) { return ->(attribute) { return id if attribute == :id return name if attribute == :name return birthdate if attribute == :birthdate return gender if attribute == :gender return title if attribute == :title nil } }

class Person attr_reader :id, :name, :birthdate, :gender, :title def initialize(name, birthdate, gender, title, id=nil) @id = id @name = name @birthdate = birthdate @gender = gender @title = title end end

Page 36: Funtional Ruby - Mikhail Bortnyk

SPECIAL KNOWLEDGE

WHAT’S WRONG WITH OO-CODE?

• WTF is “class”

Page 37: Funtional Ruby - Mikhail Bortnyk

SPECIAL KNOWLEDGE

WHAT’S WRONG WITH OO-CODE?

• WTF is “class”

• WTF are .new and initialize

Page 38: Funtional Ruby - Mikhail Bortnyk

SPECIAL KNOWLEDGE

WHAT’S WRONG WITH OO-CODE?

• WTF is “class”

• WTF are .new and initialize

• API of class

Page 39: Funtional Ruby - Mikhail Bortnyk

SPECIAL KNOWLEDGE

WHAT’S WRONG WITH OO-CODE?

• WTF is “class”

• WTF are .new and initialize

• API of class

• WTF are @-variables

Page 40: Funtional Ruby - Mikhail Bortnyk

SPECIAL KNOWLEDGE

WHAT’S WRONG WITH OO-CODE?

• WTF is “class”

• WTF are .new and initialize

• API of class

• WTF are @-variables

• difference between class and instance

Page 41: Funtional Ruby - Mikhail Bortnyk

SPECIAL KNOWLEDGE

WHAT’S WRONG WITH OO-CODE?

• WTF is “class”

• WTF are .new and initialize

• API of class

• WTF are @-variables

• difference between class and instance

• WTF is “attr_reader”

Page 42: Funtional Ruby - Mikhail Bortnyk

NO HIDDEN MAGIC

FUNCTIONAL PROGRAMMING CODE

• how to define function

Page 43: Funtional Ruby - Mikhail Bortnyk

NO HIDDEN MAGIC

FUNCTIONAL PROGRAMMING CODE

• how to define function

• how to call function

Page 44: Funtional Ruby - Mikhail Bortnyk

TO DON’T SHOOT YOUR LEG

SAFETY RULES

• do not modify, create new

Page 45: Funtional Ruby - Mikhail Bortnyk

TO DON’T SHOOT YOUR LEG

SAFETY RULES

• do not modify, create new

• BUY MORE RAM

Page 46: Funtional Ruby - Mikhail Bortnyk

TO DON’T SHOOT YOUR LEG

SAFETY RULES

• do not modify, create new

• BUY MORE RAM

• functions should not depend on environment

Page 47: Funtional Ruby - Mikhail Bortnyk

TO DON’T SHOOT YOUR LEG

SAFETY RULES

• do not modify, create new

• BUY MORE RAM

• functions should not depend on environment

• BUY EVEN MORE RAM

Page 48: Funtional Ruby - Mikhail Bortnyk

TO DON’T SHOOT YOUR LEG

SAFETY RULES

• do not modify, create new

• BUY MORE RAM

• functions should not depend on environment

• BUY EVEN MORE RAM

• avoid returns

Page 49: Funtional Ruby - Mikhail Bortnyk

TO DON’T SHOOT YOUR LEG

SAFETY RULES

• do not modify, create new

• BUY MORE RAM

• functions should not depend on environment

• BUY EVEN MORE RAM

• avoid returns

• use lambdas

Page 50: Funtional Ruby - Mikhail Bortnyk

TO DON’T SHOOT YOUR LEG

SAFETY RULES

• do not modify, create new

• BUY MORE RAM

• functions should not depend on environment

• BUY EVEN MORE RAM

• avoid returns

• use lambdas

• DO NOT FORGET TO ORDER RAM RIGHT NOW

Page 51: Funtional Ruby - Mikhail Bortnyk

SIDE TO SIDE RULES COMPARISON

FUNCTIONAL VS OBJECT-ORIENTED

• how to perform tasks and how to track changes

• state changes are important

• order of execution is important

• flow controlled by loops, conditionals, function calls

• instances of structures and classes

• focus on what information is needed and what transformations required

• state changes are non-existent

• order of execution is low-important

• flow controlled by function calls including recursion

• functions are first class objects, data collections

Page 52: Funtional Ruby - Mikhail Bortnyk

— Greenspun’s tenth rule of programming

ANY SUFFICIENTLY COMPLICATED C OR FORTRAN PROGRAM CONTAINS AN AD-HOC, INFORMALLY-SPECIFIED, BUG-RIDDEN, SLOW

IMPLEMENTATION OF HALF OF COMMON LISP.

Page 53: Funtional Ruby - Mikhail Bortnyk

PART THREE I AM DEVELOPER, I DON’T WANT

TO LEARN, I WANT PATTERN MATCHING AND IMMUTABILITY

Page 54: Funtional Ruby - Mikhail Bortnyk

STILL EVOLVING!

FUNCTIONAL-RUBY GEM

• created by Jerry D’Antonio

Page 55: Funtional Ruby - Mikhail Bortnyk

STILL EVOLVING!

FUNCTIONAL-RUBY GEM

• created by Jerry D’Antonio

• inspired by Erlang, Clojure, Haskell and Functional Java

Page 56: Funtional Ruby - Mikhail Bortnyk

STILL EVOLVING!

FUNCTIONAL-RUBY GEM

• created by Jerry D’Antonio

• inspired by Erlang, Clojure, Haskell and Functional Java

• has records, unions and tuples

Page 57: Funtional Ruby - Mikhail Bortnyk

STILL EVOLVING!

FUNCTIONAL-RUBY GEM

• created by Jerry D’Antonio

• inspired by Erlang, Clojure, Haskell and Functional Java

• has records, unions and tuples

• has protocols

Page 58: Funtional Ruby - Mikhail Bortnyk

STILL EVOLVING!

FUNCTIONAL-RUBY GEM

• created by Jerry D’Antonio

• inspired by Erlang, Clojure, Haskell and Functional Java

• has records, unions and tuples

• has protocols

• has Erlang-style pattern matching

Page 59: Funtional Ruby - Mikhail Bortnyk

STILL EVOLVING!

FUNCTIONAL-RUBY GEM

• created by Jerry D’Antonio

• inspired by Erlang, Clojure, Haskell and Functional Java

• has records, unions and tuples

• has protocols

• has Erlang-style pattern matching

• has function memoization

Page 60: Funtional Ruby - Mikhail Bortnyk

STILL EVOLVING!

FUNCTIONAL-RUBY GEM

• created by Jerry D’Antonio

• inspired by Erlang, Clojure, Haskell and Functional Java

• has records, unions and tuples

• has protocols

• has Erlang-style pattern matching

• has function memoization

• supports MRI, JRuby and Rubinius

Page 61: Funtional Ruby - Mikhail Bortnyk

FUNCTIONAL-RUBY GEM SHORT OVERVIEW

Page 62: Funtional Ruby - Mikhail Bortnyk

PATTERN MATCHING AND TYPE CHECKING

FUNCTIONAL-RUBY GEM

class Yoga include Functional::PatternMatching include Functional::TypeCheck

defn(:where_is_sun) do puts "\\o" end

defn(:where_is_sun, 14) do puts "88!" end

defn(:where_is_sun, _) do |name| puts "\\o, #{name}!" end

defn(:where_is_sun, _) do |name| puts "Are you in wrong district, #{name.rude_name}?" end.when { |name| Type?(name, Moskal) }

defn(:where_is_sun, _, _) do |name, surname| "\\o, #{name} #{surname}!" end end

Page 63: Funtional Ruby - Mikhail Bortnyk

MEMOIZATION

FUNCTIONAL-RUBY GEM

class Factors include Functional::Memo

def self.sum_of(number) of(number).reduce(:+) end

def self.of(number) (1..number).select {|i| factor?(number, i)} end

def self.factor?(number, potential) number % potential == 0 end

memoize(:sum_of) memoize(:of) end

Page 64: Funtional Ruby - Mikhail Bortnyk

RECORDS

FUNCTIONAL-RUBY GEM

Name = Functional::Record.new(:first, :middle, :last, :suffix) do mandatory :first, :last default :first, 'J.' default :last, 'Doe' end

Page 65: Funtional Ruby - Mikhail Bortnyk

QUESTION

Page 66: Funtional Ruby - Mikhail Bortnyk

Q&A

Page 67: Funtional Ruby - Mikhail Bortnyk

THANK YOU