2013 28-03-dak-why-fp

18
Почему функциональное программирование? Сборная солянка

description

My speech on Why functional programming.

Transcript of 2013 28-03-dak-why-fp

Page 1: 2013 28-03-dak-why-fp

Почему функциональное

программирование?Сборная солянка

Page 2: 2013 28-03-dak-why-fp

def sum(list): result = 0 for element in list: result = result + element return result

sum' [] = 0sum' (x:xs) = x + sum' xs

Page 3: 2013 28-03-dak-why-fp

public static <E extends Comparable<? super E>> List<E> quickSort(List<E> arr) { if (arr.size() <= 1) return arr; E pivot = arr.getFirst();

List<E> less = new LinkedList<E>(); List<E> pivotList = new LinkedList<E>(); List<E> more = new LinkedList<E>();

for (E i: arr) { if (i.compareTo(pivot) < 0) less.add(i); else if (i.compareTo(pivot) > 0) more.add(i); else pivotList.add(i); }

less = quickSort(less); more = quickSort(more);

less.addAll(pivotList); less.addAll(more); return less;}

Page 4: 2013 28-03-dak-why-fp

def qsort[T <% Ordered[T]](list:List[T]):List[T] = { list match { case Nil => Nil case x::xs => val (before,after) = xs partition (_ < x) qsort(before) ++ (x :: qsort(after)) }}

Page 5: 2013 28-03-dak-why-fp

sum(L) -> lists:foldl(fun(X, Sum) -> X + Sum end, 0, L).

Page 6: 2013 28-03-dak-why-fp
Page 7: 2013 28-03-dak-why-fp

КонкурентностьНеизбежное взаимодействие конкурентных потоков в предметной области

ПараллелизмПрограмма выполняется быстрее в условиях многоядерного окружения

Page 8: 2013 28-03-dak-why-fp

var x = 0;

setTimeout(function () { x = x + 1; }, 0);setTimeout(function () { x = x * 2; }, 0);

console.log(x);

Page 9: 2013 28-03-dak-why-fp
Page 10: 2013 28-03-dak-why-fp

$people = array();$men = array();$women = array();

foreach ($people as $person) { array_push(($person->gender == 'male' ? $men : $women), $person)}

val people: Array[Person]val (men, women) = people partition (_.gender == "male")

Page 11: 2013 28-03-dak-why-fp

???

val people: Array[Person]val (men, women) = people.par partition (_.gender == "male")

Page 12: 2013 28-03-dak-why-fp

???

val people: Array[Person]val totalMoney = people.par map (_.money) reduce (_+_)

Page 13: 2013 28-03-dak-why-fp

actor { receive { case people: Set[Person] => val (men, women) = people partition (_.gender == "male") Cosmopolitan ! women Playboy ! men }}

Page 14: 2013 28-03-dak-why-fp

class OrderController < ApplicationController before_filter :authenticate_user! before_filter :load_order, only: [:edit, :update, :destroy] before_filter :create_order_from_params, only: [:new, :create] before_filter :authorize_user_on_order!, only: [:edit, :update, :destroy] before_filter :update_order_from_params, only: [:update] before_filter :render_if_save_error, only: [:create, :update]

def new; end def edit; end

def create redirect_to success_url end

def update redirect_to @order end

def destroy @order.destroy redirect_to success_url end

def load_order @order = Order.find params[:id] end

def create_order_from_params @order = Order.new params[:order] end

def authorize_user_on_order! permission_denied! unless current_user.can_edit? @order end

def update_order_from_params @order.update_attributes end

def render_if_save_error unless @order.valid? render 'error' and return false end endend

Page 15: 2013 28-03-dak-why-fp

class OrderController < ApplicationController before_filter :authenticate_user!

def new @order = order end

def create @order = refreshed_order @order.save respond_with(@order) end

def edit @order = order end

def update @order = refreshed_order @order.save respond_with(@order) end

def destroy @order = order @order.destroy respond_with(@order) end

private

def order params[:id] ? ensure_access! Order.find(params[:id]) : Order.new end

def resfreshed_order order.tap { |o| o.attributes = params[:order] } end

def ensure_access!(order) current_user.can_edit?(order) ? order : permission_denied! endend

Page 16: 2013 28-03-dak-why-fp

class OrderController < ApplicationController before_filter :authenticate_user! helper_method :order

def new; end def edit; end

def create order.save respond_with(order) end

def update order.save respond_with(order) end

def destroy order.destroy respond_with(order) end

private

def order @_order ||= refresh(params[:id] ? ensure_access! Order.find(params[:id]) : Order.new) end

def resfresh(order) order.tap { |o| o.attributes = params[:order] if params[:order] } end

def ensure_access!(order) current_user.can_edit?(order) ? order : permission_denied! endend

Page 17: 2013 28-03-dak-why-fp

class OrderController < ApplicationController before_filter :authenticate_user!

def new; end def edit; end

def create order.save respond_with(order) end

def update order.save respond_with(order) end

def destroy order.destroy respond_with(order) end

expose(:order) { refresh(params[:id] ? ensure_access! Order.find(params[:id]) : Order.new) }

private

def resfresh(order) order.tap { |o| o.attributes = params[:order] if params[:order] } end

def ensure_access!(order) current_user.can_edit?(order) ? order : permission_denied! endend

Page 18: 2013 28-03-dak-why-fp