SlideShare une entreprise Scribd logo
WTF ?
(What's the Fold)

principes de programmation

fonctionnelle, expliqués simplement

Olivier Croisier
SPEAKER

Olivier Croisier
JavaSpecialist™
Consultant @Zenika
Formateur
Speaker
Blogger

TheCodersBreakfast.net

@OlivierCroisier

olivier@thecodersbreakfast.net

github.com/OlivierCroisier
FOLD ?

Programmation fonctionnelle
Haskell, Scala... ?
Difficile ?
Vocabulaire
Functor, Applicative, Monoid, Monad, Arrow...
map(), filter()... fold()
FOLD ?

Définition en Haskell
foldl :: (a → b → a) → a → [b] → a

… Pas de panique !

Recommandé pour vous

ALF 11 - WebAssembly
ALF 11 - WebAssemblyALF 11 - WebAssembly
ALF 11 - WebAssembly

WebAssembly

automates et langages formelsalf
Algorithm et structure de donnée
Algorithm et structure de donnéeAlgorithm et structure de donnée
Algorithm et structure de donnée

My first attempt to provide a less boring and more interactive course about algorithms and data structures :)

asd
FOLD ?

Exercice 1
Soit une liste d'entiers
→ Les additionner
List<Integer> nums = Arrays.asList(1,2,3,4,5);
FOLD ?

Exercice 1
Soit une liste d'entiers
→ Les additionner
List<Integer> nums = Arrays.asList(1,2,3,4,5);
public Integer sum(List<Integer> nums) {
Integer sum = 0;
for (Integer num : nums) {
sum = sum + num;
}
return sum;
}
FOLD ?

Exercice 2
Soit une liste d'entiers
→ Les multiplier
List<Integer> nums = Arrays.asList(1,2,3,4,5);
FOLD ?

Exercice 2
Soit une liste d'entiers
→ Les multiplier
List<Integer> nums = Arrays.asList(1,2,3,4,5);
public Integer product(List<Integer> nums) {
Integer product = 1;
for (Integer num : nums) {
product = product * num;
}
return product;
}

Recommandé pour vous

ALF 8 - Generation du code
ALF 8 - Generation du codeALF 8 - Generation du code
ALF 8 - Generation du code

Generation du code

alf
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"

The document discusses the evolving relationship between customer experience (CX) and user experience (UX). It argues that the traditional distinctions between CX and UX are false, as organizations are becoming increasingly digital and both roles rely on similar methods. CX and UX professionals are converging in their use of insights like personas and journeys to inform strategies. Both roles also measure experiences, though metrics and qualitative research are complementary rather than distinct. The document concludes by advising professionals to stop splitting hairs over definitions and instead focus on holistic experience design, research, measurement and continuous improvement across channels.

ux strat conference leah buley ux strategy
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé

Au sein d’une démarche DevOps, le build et le déploiement continue sont les premiers piliers à mettre en place. Cette session avancé de notre NighClazz “Build Tools & Continuous Delivery” a pour objectif de présenter les modes de déploiement "Blue-Green Deployment" et "Feature toggle" ainsi que les principes d'automatisation des schémas de base de données.

jenkinstogglegradle
FOLD ?

Pattern commun
Accumulateur ← valeur initiale
Boucle sur la liste
Opération (accumulateur, élément)

public Integer foo(List<Integer> nums) {
Integer accu = <init>;
for (Integer num : nums) {
accu = accu <op> num;
}
return accu;
}
FOLD ?
Type de l'accumulateur
Type des éléments de la liste

public <A, E> A fold (BiFunction<A, E, A> op,
A init,
List<E> list) {
A accu = init;
for (E num : list) {
accu = op.apply(accu, num);
}
return accu;
}
FOLD ?
BiFunction<Integer,Integer,Integer> plus =
new BiFunction<>() {
public Integer apply(Integer accu, Integer elem) {
return accu + elem;
}
};
BiFunction<Integer,Integer,Integer> mult =
new BiFunction<>() {
public Integer apply(Integer accu, Integer elem) {
return accu * elem;
}
};
Integer sum
= fold (plus, 0, nums);
Integer product = fold (mult, 1, nums);
FOLD ?

Java 8 : Expressions Lambda
(args) -> expression

BiFunction<Int,Int,Int>
BiFunction<Int,Int,Int>

plus
mult

=
=

(a,e)
(a,e)

Integer
Integer

sum
product

=
=

fold
fold

(plus,
(mult,

0,
1,

Integer
Integer

sum
product

=
=

fold
fold

((a,e)->a+e,
((a,e)->a*e,

->
->

a+e;
a*e;

nums);
nums);

0,
1,

nums);
nums);

Recommandé pour vous

Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017

"Dynamisez vos performances marketing grâce à l'Email Kinetic", présentation du webinar du 30 Mai dernier.

marketingexperianfrance
Http2
Http2Http2
Http2

A technical description of http2, including background of HTTP what's been problematic with it and how http2 and its features improves the web. See the "http2 explained" document with the complete transcript and more: http://daniel.haxx.se/http2/ (Updated version to slides shown on April 13th, 2016)

browsershttp2ietf
Better Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design ThinkingBetter Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design Thinking

This document discusses how Lean UX and Design Thinking can help product teams better define products by articulating assumptions, defining hypotheses to test assumptions, and prioritizing learning over growth. It provides examples of companies like Plancast and Formspring that launched products prematurely based on untested assumptions. The document advocates for articulating assumptions as hypotheses, conducting lightweight tests to validate customer needs before building features, and making decisions based on objective observations of outcomes and impacts rather than outputs.

lean uxproduct managementux
FOLD ?

Java 8 : Références de méthodes
Class::staticFunction
Integer sum = fold (Integer::plus, 0, nums);
public class MathUtil {
public static Integer mult(Integer x,Integer y) {
return x * y;
}
}
Integer prod = fold (MathUtil::mult, 1, nums);
FOLD ?

Définition en Haskell
foldl :: (a → b → a) → a → [b] → a

fonction

(a,b) → a

accumulateur

de type a

résultat

liste<b>
PRINCIPES

Définition

“

En programmation fonctionnelle, l'opération fold
(ou reduce) est une famille de fonctions d'ordre
supérieur qui traitent une structure de données
dans un certain ordre pour produire un résultat.
– http://www.haskell.org/haskellwiki/Fold
PRINCIPES

Avantages
Mécanisme très générique
Fonction d'ordre supérieur
Encapsulation de l'itération
Expressivité ("quoi" vs "comment")
Optimisation des opérations associatives
Famille de fonctions
foldl, foldr, foldl1, foldr1
scanl, scanr, scanl1, scanr1

Recommandé pour vous

Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
Perf ug   comment ne plus rajouter de ram a vos jvm sans savoir pourquoiPerf ug   comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi

Session du 20/11/2015 Principe de la JVM, VisualVM, Censum et EMA Eclipse Memory Analyser

visual vmcensumjvm
Http2 right now
Http2 right nowHttp2 right now
Http2 right now

Daniel Stenberg gave a presentation on the current status of HTTP/2. He discussed how HTTP usage has grown significantly, leading to slower page loads. HTTP/1.1 workarounds like concatenation and sharding add complexity. HTTP/2 aims to address these issues through features like multiplexed streams, header compression, and server push while maintaining backwards compatibility. Major browsers now support HTTP/2, but it currently only makes up a small percentage of traffic. Widespread adoption will take time as developers adjust practices.

internet protocolshttp/2ietf
Monitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.jsMonitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.js

Monitoring Compteur EDF avec node.js sur RaspberryPi / Beaglebone

monitoring raspberrypi beaglebone node.js
PRINCIPES

Fold left - foldl
accumulateur

0 + 1

[1,2,3,4,5]

1 + 2

[1,2,3,4,5]

3 + 3

[1,2,3,4,5]

6 + 4
10 + 5
15

[1,2,3,4,5]
[1,2,3,4,5]
PRINCIPES

Fold right - foldr
itération

inversée !

accumulateur

[1,2,3,4,5]

5 + 0

[1,2,3,4,5]

4 + 5

[1,2,3,4,5]
[1,2,3,4,5]
[1,2,3,4,5]

3 + 9
2 + 12
1 + 14
15
PRINCIPES

Fold left vs Fold right
Opérations non commutatives
(soustraction, division...)
foldl
foldr

(-)
(-)

0
0

[1..5]
[1..5]

quiz !

Performances
Plus efficace d'ajouter en tête des listes
→ foldr : élément à gauche, liste à droite
PRINCIPES

Autres folds
foldl1, foldr1
Même principe que foldl et foldr
Accumulateur ← 1° élément de la liste
foldl (+) 0 [1..5]
foldl1 (+) X [1..5]
valeur initiale implicite

Recommandé pour vous

Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016

Java SE 8 est sûrement la version la plus importante et la plus impactante pour les développeurs. Deux ans après sa sortie, ce talk propose des retours sur les bonnes ou moins bonnes utilisations des principales fonctionnalités de Java 8. Une connaissance de ces fonctionnalités est requise.

java 8devoxx 2016retours
Microbox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Roy

Malgré les bénéfices indéniables des architectures microservices, elles apportent une complexité non négligeable. Durant cette session, je vous présenterai la collection d’outils open source ou développé en interne que nous utilisons sur nos différents projets microservices pour limiter les délais de mise en oeuvre de ce type d’architecture. Depuis la gestion des sources jusqu’au monitoring en passant par la génération de projets et l’usine de build nous parcourrons en live l’utilisation de ces différents outils.

microservicesjavaspring
Conference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partieConference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partie

Le terme ‘Microservices’ fait le buzz depuis plusieurs mois déjà dans l’ingénierie logicielle. Durant cette soirée, Zenika vous propose de décrire en détail cette technique de décomposition de son système d’information. La première partie de la soirée présente les enjeux des MicroServices et les différents cas d’utilisation. La seconde partie aborde différents frameworks Java qui peuvent être utilisés pour la mise en place d’une architecture MicroServices.

microservicespuppetjenkins
PRINCIPES

Autres folds
scanl, scanr
scanl1, scanr1
Même principe
Renvoient toutes les valeurs intermédiaires
scanl (+) 0 [1..5]
[0,1,3,6,10,15]
scanr (+) 0 [1..5]
[15,14,12,9,5,0]
USAGES

Folds complexes
Fold sert de base à beaucoup d'algorithmes
impliquant le parcours d'une liste
Le résultat peut être une valeur unique ("reduce")
ou une autre liste !
Dépend de l'accumulateur et de l'opération
On peut effectuer une opération complexe
par composition de fonctions simples
f(g(x)) ↔ (f ⋅ g)(x)
USAGES

Fonction map
Applique une fonction f à chaque élément
[1,2,3,4,5] → [f(1),f(2),f(3),f(4),f(5)]

Implémentation avec foldr
Accumulateur ← liste cible vide
Pour chaque élément e :
- Calculer f(e)
- Ajouter f(e) à la liste cible

fonction

composée
USAGES

Fonction map
"cons"

fonction f

result = foldr ((:).(*2)) [] [1..5]

composition de
fonctions

- application de f

- puis ajout à la liste

Recommandé pour vous

Introduction to HTTP/2
Introduction to HTTP/2Introduction to HTTP/2
Introduction to HTTP/2

This document introduces HTTP/2, describing its goals of improving on HTTP 1.1 by allowing multiple requests to be sent over a single TCP connection through request multiplexing and header compression. It outlines issues with HTTP 1.1 like head-of-line blocking and slow start that cause latency. HTTP/2 aims to address these by sending requests concurrently in interleaved frames and compressing headers. The document demonstrates these concepts and how to troubleshoot HTTP/2 connections using the Chrome network console and Wireshark.

http2
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge

This session explains how JAX-RS and CDI became reactive capable in Java EE 8. We put some new features of JAX-RS 2.1 and CDI 2.0 into perspective and show some reactive patterns to improve your application. Add Java 8 CompletionStage to the mix and this API trio becomes your best bet to easily go reactive without leaving the Java EE train.

java 8java eecompletable future
Business intelligence v0.3
Business intelligence v0.3Business intelligence v0.3
Business intelligence v0.3

Business Intelligence

bi business intelligence dwh datawarehouse data
USAGES

Fonction map
List<Integer> accu = new ArrayList<>();
BiFunction<List<Integer>,Integer,List<Integer>> op =
(l,e) -> {
l.add(0, e * 2);
return l;
};
List<Int> result = foldr(op, accu, nums);
USAGES

Fonction filter
Sélectionne uniquement les éléments qui
répondent à un prédicat p
[1,2,3,4,5] –-(garder si >3)--> [4,5]

Implémentation avec foldr
Accumulateur ← liste cible vide
Pour chaque élément e :
- Vérifier p(e)
- Si p(e), ajouter e à la liste cible

fonction

composée
USAGES

Fonction filter
ajout de l'élément à
l'accumulateur

let op e list = if e
then
else

> 3
(e:list)
list

result = foldr op [] [1..5]
USAGES

Fonction filter
List<Integer> accu = new LinkedList<>();
BiFunction<List<Integer>,Integer,List<Integer>> op =
(l, e) -> {
if (e > 3) l.add(0,e);
return l;
};
List<Int> result = foldr(op, accu, nums);

Recommandé pour vous

JavaFX et le JDK9
JavaFX et le JDK9JavaFX et le JDK9
JavaFX et le JDK9

Présentation de JavaFX et du JDK9 dispensée à Softshake 2016

javafxjigsawosgi
HTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréHTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien Landuré

HTTP1 est omniprésent en 2016 et HTTP2 est pourtant "sorti" le 15 mai 2015. Qu'est-ce qu'on y gagne, nous développeurs ? Les principes d'optimisation Web seront-ils toujours d'actualités ? Venez découvrir HTTP2, le futur protocole du Web !

http2slidesperformance
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleAgile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle

DAD, Spotify, Nexus, LeSS et SAFe

USAGES

Fonction count
Compte le nombre d'éléments dans la liste
[1,2,3,4,5] → 5

Implémentation avec foldl
Accumulateur ← 0
Pour chaque élément e :
- Incrémenter l'accumulateur
USAGES

Fonction count
count = foldl (a e → a+1) 0 [1..5]
Integer result = foldl((a,e)->a+1, 0, nums)
USAGES

Fonction max
Renvoie le plus grand élément de la liste
[1,2,3,4,5] → 5

Implémentation avec foldl
Accumulateur ← 0
Pour chaque élément e :
- Si e > accumulateur, alors accumulateur = e
USAGES

Fonction max
let op e m = if e
then
else

> m
e
m

result = foldl op 0 [1..5]
Integer max = foldl((e,m)-> e>m?e:m, 0, nums);

Recommandé pour vous

NightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteNightClazz Java 8 Decouverte
NightClazz Java 8 Decouverte

Dans la continuité de la conférence Java Concurrency and Non-blocking IO Lecture animée par Heinz Kabutz, Zenika vous propose d'assister à la NightClazz Java 8 - Découverte.

nightclazzjava 8stream
What HTTP/2.0 Will Do For You
What HTTP/2.0 Will Do For YouWhat HTTP/2.0 Will Do For You
What HTTP/2.0 Will Do For You

An overview of where HTTP/2.0 is at and what it might mean for how we deploy and operate the Web, from the chair of the IETF HTTPbis Working Group.

http2httpbishttp
Http2 les impacts dans le web
Http2 les impacts dans le webHttp2 les impacts dans le web
Http2 les impacts dans le web

Présentation à la nAcademy (Mars 2015) : Http/2 les impacts dans le web par Christophe Villeneuve

webhttphttp2
IMPLEMENTATIONS

Java 8
Notion de Stream (java.util.stream.Stream)
Pipeline de transformation
Spécialisé par type (IntStream…)
Implémente reduce (foldl restreint à 1 type)
T reduce( T identity,
BinaryOperator<T> reducer );
List<Integer> nums = Arrays.asList(1,2,3,4,5);
int sum = nums.stream()
.reduce(0, Integer::sum);
IMPLEMENTATIONS

Javascript
Sur les tableaux
reduce (foldl) et reduceRight (foldr)
array.reduce
(func,
array.reduceRight(func,

initval)
initval)

var nums = new Array(1,2,3,4,5);
var sum = nums.reduce(
function(a,e) {return a+e;},
0);
IMPLEMENTATIONS

Scala
Sur les listes et tableaux
foldLeft (/:) et foldRight (:)
List.foldLeft (initval)(func)
List.foldRight(initval)(func)
val nums = Array(1, 2, 3, 4, 5)
val sum = nums.foldLeft(0)(_+_)
val sum = (0 /: list)(_+_)
IMPLEMENTATIONS

Groovy
Sur les listes
list.inject (foldl)
nums = [1,2,3,4];
sum = nums.inject(0) { a,e -> a+e }

Recommandé pour vous

La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCaml

La programmation fonctionnelle avec le langage OCaml. Présentation Orléans Tech du 26 avril 2016.

programmation fonctionnelletech talkfunctional programming
Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012

Présentation d'Incanter et initiation à Clojure. Les exemples de code sont sur GitHub https://github.com/cfalguiere/Demo-Incanter-Devoxx-France

incanterstatisticsclojure
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scala

Cette présentation aura pour objectif d’introduire le langage de programmation Scala. Ce dernier bénéficie depuis plusieurs mois d’un véritable engouement qui se reflète au regard de la communauté française croissante. Pour cela Ludwine Probst et Florent Lagrede reviendront donc sur les notions fondamentales, illustrées d’exemples sur des problèmes récurrents de programmation, afin de dégager les spécificités de ce langage et certains de ses atouts. Aucune connaissance de Scala n’est donc nécessaire, seulement l’envie de découvrir un nouveau langage.

scaladocintellijsbt
CONCLUSION

Alors, What's The Fold ?
Un principe simple, puissant et générique
Socle pour d'autre opérations
map, filter, count...
Déjà présent dans vos langages
reduce, inject, foldLeft...
Apprenez à le reconnaître !
questions ?

Contenu connexe

Tendances

Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
Patrick Allaert
 
ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer
Alexandru Radovici
 
ALF 10 - Convention d'appel de fonction
ALF 10 - Convention d'appel de fonctionALF 10 - Convention d'appel de fonction
ALF 10 - Convention d'appel de fonction
Alexandru Radovici
 
ALF 11 - WebAssembly
ALF 11 - WebAssemblyALF 11 - WebAssembly
ALF 11 - WebAssembly
Alexandru Radovici
 
Algorithm et structure de donnée
Algorithm et structure de donnéeAlgorithm et structure de donnée
ALF 8 - Generation du code
ALF 8 - Generation du codeALF 8 - Generation du code
ALF 8 - Generation du code
Alexandru Radovici
 

Tendances (7)

Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
 
ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer
 
ALF 10 - Convention d'appel de fonction
ALF 10 - Convention d'appel de fonctionALF 10 - Convention d'appel de fonction
ALF 10 - Convention d'appel de fonction
 
ALF 11 - WebAssembly
ALF 11 - WebAssemblyALF 11 - WebAssembly
ALF 11 - WebAssembly
 
Theme 9
Theme 9Theme 9
Theme 9
 
Algorithm et structure de donnée
Algorithm et structure de donnéeAlgorithm et structure de donnée
Algorithm et structure de donnée
 
ALF 8 - Generation du code
ALF 8 - Generation du codeALF 8 - Generation du code
ALF 8 - Generation du code
 

En vedette

UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
Zenika
 
Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017
Experian
 
Http2
Http2Http2
Better Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design ThinkingBetter Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design Thinking
Jeff Gothelf
 
Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
Perf ug   comment ne plus rajouter de ram a vos jvm sans savoir pourquoiPerf ug   comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
pkernevez
 
Http2 right now
Http2 right nowHttp2 right now
Http2 right now
Daniel Stenberg
 
Monitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.jsMonitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.js
laurenthuet
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
Jean-Michel Doudoux
 
Microbox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Roy
ekino
 
Conference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partieConference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partie
Zenika
 
Introduction to HTTP/2
Introduction to HTTP/2Introduction to HTTP/2
Introduction to HTTP/2
Ido Flatow
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
José Paumard
 
Business intelligence v0.3
Business intelligence v0.3Business intelligence v0.3
Business intelligence v0.3
Luca Mauri
 
JavaFX et le JDK9
JavaFX et le JDK9JavaFX et le JDK9
JavaFX et le JDK9
Thierry Wasylczenko
 
HTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréHTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien Landuré
Zenika
 
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleAgile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Zenika
 
NightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteNightClazz Java 8 Decouverte
NightClazz Java 8 Decouverte
Zenika
 
What HTTP/2.0 Will Do For You
What HTTP/2.0 Will Do For YouWhat HTTP/2.0 Will Do For You
What HTTP/2.0 Will Do For You
Mark Nottingham
 
Http2 les impacts dans le web
Http2 les impacts dans le webHttp2 les impacts dans le web
Http2 les impacts dans le web
neuros
 

En vedette (20)

UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
 
Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017
 
Http2
Http2Http2
Http2
 
Better Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design ThinkingBetter Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design Thinking
 
Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
Perf ug   comment ne plus rajouter de ram a vos jvm sans savoir pourquoiPerf ug   comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
 
Http2 right now
Http2 right nowHttp2 right now
Http2 right now
 
Monitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.jsMonitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.js
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
Microbox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Roy
 
Conference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partieConference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partie
 
Introduction to HTTP/2
Introduction to HTTP/2Introduction to HTTP/2
Introduction to HTTP/2
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
Business intelligence v0.3
Business intelligence v0.3Business intelligence v0.3
Business intelligence v0.3
 
JavaFX et le JDK9
JavaFX et le JDK9JavaFX et le JDK9
JavaFX et le JDK9
 
HTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréHTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien Landuré
 
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleAgile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
 
NightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteNightClazz Java 8 Decouverte
NightClazz Java 8 Decouverte
 
What HTTP/2.0 Will Do For You
What HTTP/2.0 Will Do For YouWhat HTTP/2.0 Will Do For You
What HTTP/2.0 Will Do For You
 
Http2 les impacts dans le web
Http2 les impacts dans le webHttp2 les impacts dans le web
Http2 les impacts dans le web
 

Similaire à WTF - What's The Fold - Bordeaux JUG 2013

La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCaml
Stéphane Legrand
 
Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012
Claude Falguiere
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scala
SOAT
 
5- understandinggJava_Collections_v4.pdf
5- understandinggJava_Collections_v4.pdf5- understandinggJava_Collections_v4.pdf
5- understandinggJava_Collections_v4.pdf
AliouDiallo24
 
Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012
Pablo Tamarit
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
MICHRAFY MUSTAFA
 
3 - programmation modulaire avec python.pdf
3 - programmation modulaire avec python.pdf3 - programmation modulaire avec python.pdf
3 - programmation modulaire avec python.pdf
LaodouKY
 
Ce bon vieux propel
Ce bon vieux propelCe bon vieux propel
Ce bon vieux propel
Francois Zaninotto
 
Coffee script
Coffee scriptCoffee script
Coffee script
antho1404
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
halleck45
 
Ns python 2
Ns python 2Ns python 2
Ns python 2
Olivier Rovellotti
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
Abdoulaye Dieng
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
Aziz Darouichi
 
ALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlleALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlle
Alexandru Radovici
 
coursAlgo_V6.ppt
coursAlgo_V6.pptcoursAlgo_V6.ppt
coursAlgo_V6.ppt
MonssifNajim1
 
Chapitre 1 rappel
Chapitre 1   rappelChapitre 1   rappel
Chapitre 1 rappel
Sana Aroussi
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Shellmates
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Normandy JUG
 

Similaire à WTF - What's The Fold - Bordeaux JUG 2013 (20)

La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCaml
 
Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scala
 
Theme 7
Theme 7Theme 7
Theme 7
 
5- understandinggJava_Collections_v4.pdf
5- understandinggJava_Collections_v4.pdf5- understandinggJava_Collections_v4.pdf
5- understandinggJava_Collections_v4.pdf
 
Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
 
3 - programmation modulaire avec python.pdf
3 - programmation modulaire avec python.pdf3 - programmation modulaire avec python.pdf
3 - programmation modulaire avec python.pdf
 
Ce bon vieux propel
Ce bon vieux propelCe bon vieux propel
Ce bon vieux propel
 
Coffee script
Coffee scriptCoffee script
Coffee script
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
Ns python 2
Ns python 2Ns python 2
Ns python 2
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
 
ALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlleALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlle
 
Python chapitre 4.pdf
Python chapitre 4.pdfPython chapitre 4.pdf
Python chapitre 4.pdf
 
coursAlgo_V6.ppt
coursAlgo_V6.pptcoursAlgo_V6.ppt
coursAlgo_V6.ppt
 
Chapitre 1 rappel
Chapitre 1   rappelChapitre 1   rappel
Chapitre 1 rappel
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El Hassani
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 

Plus de Zenika

Datascience & IoT
Datascience & IoTDatascience & IoT
Datascience & IoT
Zenika
 
Matinale Agile Wake Up #4 : les tests et l'agilité
Matinale Agile Wake Up #4 : les tests et l'agilitéMatinale Agile Wake Up #4 : les tests et l'agilité
Matinale Agile Wake Up #4 : les tests et l'agilité
Zenika
 
Agile Wake Up #3 : Lean UX
Agile Wake Up #3 : Lean UXAgile Wake Up #3 : Lean UX
Agile Wake Up #3 : Lean UX
Zenika
 
Agile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio DigitalAgile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio Digital
Zenika
 
Agile Wake Up #3 : la contractualisation Agile
Agile Wake Up #3 : la contractualisation AgileAgile Wake Up #3 : la contractualisation Agile
Agile Wake Up #3 : la contractualisation Agile
Zenika
 
Zenika matinale spark-zeppelin_ml
Zenika matinale spark-zeppelin_mlZenika matinale spark-zeppelin_ml
Zenika matinale spark-zeppelin_ml
Zenika
 
Docker du mythe à la réalité
Docker du mythe à la réalitéDocker du mythe à la réalité
Docker du mythe à la réalité
Zenika
 
Motivation 3.0 : sens, autonomie et maîtrise.
Motivation 3.0 : sens, autonomie et maîtrise.Motivation 3.0 : sens, autonomie et maîtrise.
Motivation 3.0 : sens, autonomie et maîtrise.
Zenika
 
Matinale React
Matinale ReactMatinale React
Matinale React
Zenika
 
NigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
NigthClazz Spark - Machine Learning / Introduction à Spark et ZeppelinNigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
NigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
Zenika
 
NightClazz Spark / Machine Learning
NightClazz Spark / Machine LearningNightClazz Spark / Machine Learning
NightClazz Spark / Machine Learning
Zenika
 
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Zenika
 
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud VillenaveAgile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Zenika
 
Entreprise libérée : Du mythe à la réalité ?
Entreprise libérée : Du mythe à la réalité ?Entreprise libérée : Du mythe à la réalité ?
Entreprise libérée : Du mythe à la réalité ?
Zenika
 
NightClazz Docker Découverte
NightClazz Docker Découverte NightClazz Docker Découverte
NightClazz Docker Découverte
Zenika
 
Matinale DevOps / Docker
Matinale DevOps / DockerMatinale DevOps / Docker
Matinale DevOps / Docker
Zenika
 
NightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous DeliveryNightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous Delivery
Zenika
 
Deadlock Victim
Deadlock VictimDeadlock Victim
Deadlock Victim
Zenika
 
Seren
SerenSeren
Seren
Zenika
 
What’s Next Replay! Lyon 2011 - G. Darmont
What’s Next Replay! Lyon 2011 - G. DarmontWhat’s Next Replay! Lyon 2011 - G. Darmont
What’s Next Replay! Lyon 2011 - G. Darmont
Zenika
 

Plus de Zenika (20)

Datascience & IoT
Datascience & IoTDatascience & IoT
Datascience & IoT
 
Matinale Agile Wake Up #4 : les tests et l'agilité
Matinale Agile Wake Up #4 : les tests et l'agilitéMatinale Agile Wake Up #4 : les tests et l'agilité
Matinale Agile Wake Up #4 : les tests et l'agilité
 
Agile Wake Up #3 : Lean UX
Agile Wake Up #3 : Lean UXAgile Wake Up #3 : Lean UX
Agile Wake Up #3 : Lean UX
 
Agile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio DigitalAgile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio Digital
 
Agile Wake Up #3 : la contractualisation Agile
Agile Wake Up #3 : la contractualisation AgileAgile Wake Up #3 : la contractualisation Agile
Agile Wake Up #3 : la contractualisation Agile
 
Zenika matinale spark-zeppelin_ml
Zenika matinale spark-zeppelin_mlZenika matinale spark-zeppelin_ml
Zenika matinale spark-zeppelin_ml
 
Docker du mythe à la réalité
Docker du mythe à la réalitéDocker du mythe à la réalité
Docker du mythe à la réalité
 
Motivation 3.0 : sens, autonomie et maîtrise.
Motivation 3.0 : sens, autonomie et maîtrise.Motivation 3.0 : sens, autonomie et maîtrise.
Motivation 3.0 : sens, autonomie et maîtrise.
 
Matinale React
Matinale ReactMatinale React
Matinale React
 
NigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
NigthClazz Spark - Machine Learning / Introduction à Spark et ZeppelinNigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
NigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
 
NightClazz Spark / Machine Learning
NightClazz Spark / Machine LearningNightClazz Spark / Machine Learning
NightClazz Spark / Machine Learning
 
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
 
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud VillenaveAgile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
 
Entreprise libérée : Du mythe à la réalité ?
Entreprise libérée : Du mythe à la réalité ?Entreprise libérée : Du mythe à la réalité ?
Entreprise libérée : Du mythe à la réalité ?
 
NightClazz Docker Découverte
NightClazz Docker Découverte NightClazz Docker Découverte
NightClazz Docker Découverte
 
Matinale DevOps / Docker
Matinale DevOps / DockerMatinale DevOps / Docker
Matinale DevOps / Docker
 
NightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous DeliveryNightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous Delivery
 
Deadlock Victim
Deadlock VictimDeadlock Victim
Deadlock Victim
 
Seren
SerenSeren
Seren
 
What’s Next Replay! Lyon 2011 - G. Darmont
What’s Next Replay! Lyon 2011 - G. DarmontWhat’s Next Replay! Lyon 2011 - G. Darmont
What’s Next Replay! Lyon 2011 - G. Darmont
 

Dernier

Cours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Cours d'Intelligence Artificielle et Apprentissage Automatique.pptxCours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Cours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Jacques KIZA DIMANDJA
 
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Erol GIRAUDY
 
Meetup LFUG : Cahier de vacances Liferay
Meetup LFUG : Cahier de vacances LiferayMeetup LFUG : Cahier de vacances Liferay
Meetup LFUG : Cahier de vacances Liferay
Sébastien Le Marchand
 
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Maalik Jallo
 
Introduction à Crossplane (Talk Devoxx 2023)
Introduction à Crossplane (Talk Devoxx 2023)Introduction à Crossplane (Talk Devoxx 2023)
Introduction à Crossplane (Talk Devoxx 2023)
Adrien Blind
 
procede de fabrication mecanique et industriel
procede de fabrication mecanique et industrielprocede de fabrication mecanique et industriel
procede de fabrication mecanique et industriel
saadbellaari
 
CLAUDE 3.5 SONNET EXPLICATIONS sur les usages
CLAUDE 3.5 SONNET EXPLICATIONS sur les usagesCLAUDE 3.5 SONNET EXPLICATIONS sur les usages
CLAUDE 3.5 SONNET EXPLICATIONS sur les usages
Erol GIRAUDY
 
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdfTutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Erol GIRAUDY
 

Dernier (8)

Cours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Cours d'Intelligence Artificielle et Apprentissage Automatique.pptxCours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Cours d'Intelligence Artificielle et Apprentissage Automatique.pptx
 
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
 
Meetup LFUG : Cahier de vacances Liferay
Meetup LFUG : Cahier de vacances LiferayMeetup LFUG : Cahier de vacances Liferay
Meetup LFUG : Cahier de vacances Liferay
 
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
 
Introduction à Crossplane (Talk Devoxx 2023)
Introduction à Crossplane (Talk Devoxx 2023)Introduction à Crossplane (Talk Devoxx 2023)
Introduction à Crossplane (Talk Devoxx 2023)
 
procede de fabrication mecanique et industriel
procede de fabrication mecanique et industrielprocede de fabrication mecanique et industriel
procede de fabrication mecanique et industriel
 
CLAUDE 3.5 SONNET EXPLICATIONS sur les usages
CLAUDE 3.5 SONNET EXPLICATIONS sur les usagesCLAUDE 3.5 SONNET EXPLICATIONS sur les usages
CLAUDE 3.5 SONNET EXPLICATIONS sur les usages
 
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdfTutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdf
 

WTF - What's The Fold - Bordeaux JUG 2013

  • 1. WTF ? (What's the Fold) principes de programmation fonctionnelle, expliqués simplement Olivier Croisier
  • 3. FOLD ? Programmation fonctionnelle Haskell, Scala... ? Difficile ? Vocabulaire Functor, Applicative, Monoid, Monad, Arrow... map(), filter()... fold()
  • 4. FOLD ? Définition en Haskell foldl :: (a → b → a) → a → [b] → a … Pas de panique !
  • 5. FOLD ? Exercice 1 Soit une liste d'entiers → Les additionner List<Integer> nums = Arrays.asList(1,2,3,4,5);
  • 6. FOLD ? Exercice 1 Soit une liste d'entiers → Les additionner List<Integer> nums = Arrays.asList(1,2,3,4,5); public Integer sum(List<Integer> nums) { Integer sum = 0; for (Integer num : nums) { sum = sum + num; } return sum; }
  • 7. FOLD ? Exercice 2 Soit une liste d'entiers → Les multiplier List<Integer> nums = Arrays.asList(1,2,3,4,5);
  • 8. FOLD ? Exercice 2 Soit une liste d'entiers → Les multiplier List<Integer> nums = Arrays.asList(1,2,3,4,5); public Integer product(List<Integer> nums) { Integer product = 1; for (Integer num : nums) { product = product * num; } return product; }
  • 9. FOLD ? Pattern commun Accumulateur ← valeur initiale Boucle sur la liste Opération (accumulateur, élément) public Integer foo(List<Integer> nums) { Integer accu = <init>; for (Integer num : nums) { accu = accu <op> num; } return accu; }
  • 10. FOLD ? Type de l'accumulateur Type des éléments de la liste public <A, E> A fold (BiFunction<A, E, A> op, A init, List<E> list) { A accu = init; for (E num : list) { accu = op.apply(accu, num); } return accu; }
  • 11. FOLD ? BiFunction<Integer,Integer,Integer> plus = new BiFunction<>() { public Integer apply(Integer accu, Integer elem) { return accu + elem; } }; BiFunction<Integer,Integer,Integer> mult = new BiFunction<>() { public Integer apply(Integer accu, Integer elem) { return accu * elem; } }; Integer sum = fold (plus, 0, nums); Integer product = fold (mult, 1, nums);
  • 12. FOLD ? Java 8 : Expressions Lambda (args) -> expression BiFunction<Int,Int,Int> BiFunction<Int,Int,Int> plus mult = = (a,e) (a,e) Integer Integer sum product = = fold fold (plus, (mult, 0, 1, Integer Integer sum product = = fold fold ((a,e)->a+e, ((a,e)->a*e, -> -> a+e; a*e; nums); nums); 0, 1, nums); nums);
  • 13. FOLD ? Java 8 : Références de méthodes Class::staticFunction Integer sum = fold (Integer::plus, 0, nums); public class MathUtil { public static Integer mult(Integer x,Integer y) { return x * y; } } Integer prod = fold (MathUtil::mult, 1, nums);
  • 14. FOLD ? Définition en Haskell foldl :: (a → b → a) → a → [b] → a fonction (a,b) → a accumulateur de type a résultat liste<b>
  • 15. PRINCIPES Définition “ En programmation fonctionnelle, l'opération fold (ou reduce) est une famille de fonctions d'ordre supérieur qui traitent une structure de données dans un certain ordre pour produire un résultat. – http://www.haskell.org/haskellwiki/Fold
  • 16. PRINCIPES Avantages Mécanisme très générique Fonction d'ordre supérieur Encapsulation de l'itération Expressivité ("quoi" vs "comment") Optimisation des opérations associatives Famille de fonctions foldl, foldr, foldl1, foldr1 scanl, scanr, scanl1, scanr1
  • 17. PRINCIPES Fold left - foldl accumulateur 0 + 1 [1,2,3,4,5] 1 + 2 [1,2,3,4,5] 3 + 3 [1,2,3,4,5] 6 + 4 10 + 5 15 [1,2,3,4,5] [1,2,3,4,5]
  • 18. PRINCIPES Fold right - foldr itération inversée ! accumulateur [1,2,3,4,5] 5 + 0 [1,2,3,4,5] 4 + 5 [1,2,3,4,5] [1,2,3,4,5] [1,2,3,4,5] 3 + 9 2 + 12 1 + 14 15
  • 19. PRINCIPES Fold left vs Fold right Opérations non commutatives (soustraction, division...) foldl foldr (-) (-) 0 0 [1..5] [1..5] quiz ! Performances Plus efficace d'ajouter en tête des listes → foldr : élément à gauche, liste à droite
  • 20. PRINCIPES Autres folds foldl1, foldr1 Même principe que foldl et foldr Accumulateur ← 1° élément de la liste foldl (+) 0 [1..5] foldl1 (+) X [1..5] valeur initiale implicite
  • 21. PRINCIPES Autres folds scanl, scanr scanl1, scanr1 Même principe Renvoient toutes les valeurs intermédiaires scanl (+) 0 [1..5] [0,1,3,6,10,15] scanr (+) 0 [1..5] [15,14,12,9,5,0]
  • 22. USAGES Folds complexes Fold sert de base à beaucoup d'algorithmes impliquant le parcours d'une liste Le résultat peut être une valeur unique ("reduce") ou une autre liste ! Dépend de l'accumulateur et de l'opération On peut effectuer une opération complexe par composition de fonctions simples f(g(x)) ↔ (f ⋅ g)(x)
  • 23. USAGES Fonction map Applique une fonction f à chaque élément [1,2,3,4,5] → [f(1),f(2),f(3),f(4),f(5)] Implémentation avec foldr Accumulateur ← liste cible vide Pour chaque élément e : - Calculer f(e) - Ajouter f(e) à la liste cible fonction composée
  • 24. USAGES Fonction map "cons" fonction f result = foldr ((:).(*2)) [] [1..5] composition de fonctions - application de f - puis ajout à la liste
  • 25. USAGES Fonction map List<Integer> accu = new ArrayList<>(); BiFunction<List<Integer>,Integer,List<Integer>> op = (l,e) -> { l.add(0, e * 2); return l; }; List<Int> result = foldr(op, accu, nums);
  • 26. USAGES Fonction filter Sélectionne uniquement les éléments qui répondent à un prédicat p [1,2,3,4,5] –-(garder si >3)--> [4,5] Implémentation avec foldr Accumulateur ← liste cible vide Pour chaque élément e : - Vérifier p(e) - Si p(e), ajouter e à la liste cible fonction composée
  • 27. USAGES Fonction filter ajout de l'élément à l'accumulateur let op e list = if e then else > 3 (e:list) list result = foldr op [] [1..5]
  • 28. USAGES Fonction filter List<Integer> accu = new LinkedList<>(); BiFunction<List<Integer>,Integer,List<Integer>> op = (l, e) -> { if (e > 3) l.add(0,e); return l; }; List<Int> result = foldr(op, accu, nums);
  • 29. USAGES Fonction count Compte le nombre d'éléments dans la liste [1,2,3,4,5] → 5 Implémentation avec foldl Accumulateur ← 0 Pour chaque élément e : - Incrémenter l'accumulateur
  • 30. USAGES Fonction count count = foldl (a e → a+1) 0 [1..5] Integer result = foldl((a,e)->a+1, 0, nums)
  • 31. USAGES Fonction max Renvoie le plus grand élément de la liste [1,2,3,4,5] → 5 Implémentation avec foldl Accumulateur ← 0 Pour chaque élément e : - Si e > accumulateur, alors accumulateur = e
  • 32. USAGES Fonction max let op e m = if e then else > m e m result = foldl op 0 [1..5] Integer max = foldl((e,m)-> e>m?e:m, 0, nums);
  • 33. IMPLEMENTATIONS Java 8 Notion de Stream (java.util.stream.Stream) Pipeline de transformation Spécialisé par type (IntStream…) Implémente reduce (foldl restreint à 1 type) T reduce( T identity, BinaryOperator<T> reducer ); List<Integer> nums = Arrays.asList(1,2,3,4,5); int sum = nums.stream() .reduce(0, Integer::sum);
  • 34. IMPLEMENTATIONS Javascript Sur les tableaux reduce (foldl) et reduceRight (foldr) array.reduce (func, array.reduceRight(func, initval) initval) var nums = new Array(1,2,3,4,5); var sum = nums.reduce( function(a,e) {return a+e;}, 0);
  • 35. IMPLEMENTATIONS Scala Sur les listes et tableaux foldLeft (/:) et foldRight (:) List.foldLeft (initval)(func) List.foldRight(initval)(func) val nums = Array(1, 2, 3, 4, 5) val sum = nums.foldLeft(0)(_+_) val sum = (0 /: list)(_+_)
  • 36. IMPLEMENTATIONS Groovy Sur les listes list.inject (foldl) nums = [1,2,3,4]; sum = nums.inject(0) { a,e -> a+e }
  • 37. CONCLUSION Alors, What's The Fold ? Un principe simple, puissant et générique Socle pour d'autre opérations map, filter, count... Déjà présent dans vos langages reduce, inject, foldLeft... Apprenez à le reconnaître !