<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de SpiceGuid</title>
	<atom:link href="https://blog.developpez.com/damien-guichard/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/damien-guichard</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 16:08:44 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Mise à jour vers la version 0.2c</title>
		<link>https://blog.developpez.com/damien-guichard/p11053/logiciel-libre/mise_a_jour_vers_la_version_0_2c</link>
		<comments>https://blog.developpez.com/damien-guichard/p11053/logiciel-libre/mise_a_jour_vers_la_version_0_2c#comments</comments>
		<pubDate>Mon, 28 May 2012 16:08:44 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[ERic]]></category>
		<category><![CDATA[Logiciel Libre]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[ERic (Entity-Relationship interactive calculator) est un jeune logiciel libre, en ligne de commande, sous licence EUPL-1.1. ERic permet d&#8217;éditer et de sauvegarder des ontologies et des bases de connaissance sous forme de graphes entités/relations. Ensuite, grâce à son algorithme de subsomption, ERic est capable d&#8217;interroger sa base de connaissance de façon remarquablement flexible. ERic v0.2c ajoute le support des nombres réels flottants et des unités SI du système international de mesure. Le forum d&#8217;ERic hébergé [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://www.developpez.net/forums/f1699/applications/projets/projets-heberges/eric/" target="_blank"><img src="http://damien-guichard.developpez.com/illustrations/developpez_0112.png"/></a></center></p>
<p><strong>ERic</strong> (Entity-Relationship interactive calculator) est un jeune logiciel libre, en ligne de commande, sous licence <a href="http://joinup.ec.europa.eu/software/page/eupl/licence-eupl" target="_blank">EUPL-1.1</a>.<br />
ERic permet d&rsquo;éditer et de sauvegarder des ontologies et des bases de connaissance sous forme de graphes entités/relations. Ensuite, grâce à son algorithme de subsomption, ERic est capable d&rsquo;interroger sa base de connaissance de façon remarquablement flexible.</p>
<p><strong>ERic v0.2c</strong> ajoute le support des nombres réels flottants et des unités SI du système international de mesure.</p>
<ul>
<li>Le <a href="http://www.developpez.net/forums/f1699/applications/projets/projets-heberges/eric/" target="_blank">forum d&rsquo;ERic</a> hébergé par developpez.net</li>
<li>Le <a href="http://subversion.developpez.com/projets/ERic/trunk/" target="_blank">dépôt SVN d&rsquo;ERic</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A gentle introduction to 2-dimensional algebra and string diagrams</title>
		<link>https://blog.developpez.com/damien-guichard/p10983/divers/a_gentle_introduction_to_2_dimensional_a</link>
		<comments>https://blog.developpez.com/damien-guichard/p10983/divers/a_gentle_introduction_to_2_dimensional_a#comments</comments>
		<pubDate>Thu, 26 Apr 2012 12:54:40 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Divers]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour ceux qui aiment la théorie des catégories et les preuves diagrammatiques Paul-André Melliès présente une (nouvelle?) approche graphique à la croisée du calcul des séquents et de la théorie des noeuds. Cliquez sur l&#8217;image pour télécharger les slides pdf.]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://www.pps.jussieu.fr/~mellies/slides/cours-roma-tre.pdf" target="_blank"><img src="http://damien-guichard.developpez.com/illustrations/developpez_0113.png"/></a></center></p>
<p>Pour ceux qui aiment la théorie des catégories et les preuves diagrammatiques <a href="http://www.pps.jussieu.fr/~mellies/" target="_blank">Paul-André Melliès</a> présente une (nouvelle?) approche graphique à la croisée du calcul des séquents et de la théorie des noeuds.</p>
<p>Cliquez sur l&rsquo;image pour télécharger les <a href="http://www.pps.jussieu.fr/~mellies/slides/cours-roma-tre.pdf" target="_blank">slides <strong>pdf</strong></a>.  </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ERic disponible en version 0.2a</title>
		<link>https://blog.developpez.com/damien-guichard/p10963/logiciel-libre/eric_disponible_en_version_0_2a</link>
		<comments>https://blog.developpez.com/damien-guichard/p10963/logiciel-libre/eric_disponible_en_version_0_2a#comments</comments>
		<pubDate>Thu, 19 Apr 2012 15:27:23 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[ERic]]></category>
		<category><![CDATA[Logiciel Libre]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce billet annonce la disponibilité immédiate d&#8217;ERic v0.2a ERic (Entity-Relationship interactive calculator) est un jeune logiciel libre, en ligne de commande, sous licence EUPL-1.1. ERic permet d&#8217;éditer et de sauvegarder des ontologies et des bases de connaissance sous forme de graphes entités/relations. Ensuite, grâce à son algorithme de subsomption, ERic est capable d&#8217;interroger sa base de connaissance de façon remarquablement flexible. Le forum hébergé par developpez.net Le dépôt SVN]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://www.developpez.net/forums/f1699/applications/projets/projets-heberges/eric/" target="_blank"><img src="http://damien-guichard.developpez.com/illustrations/developpez_0112.png"/></a></center></p>
<p>Ce billet annonce la disponibilité immédiate d&rsquo;<strong>ERic v0.2a</strong></p>
<p><strong>ERic</strong> (Entity-Relationship interactive calculator) est un jeune logiciel libre, en ligne de commande, sous licence <a href="http://joinup.ec.europa.eu/software/page/eupl/licence-eupl" target="_blank">EUPL-1.1</a>.<br />
ERic permet d&rsquo;éditer et de sauvegarder des ontologies et des bases de connaissance sous forme de graphes entités/relations. Ensuite, grâce à son algorithme de subsomption, ERic est capable d&rsquo;interroger sa base de connaissance de façon remarquablement flexible.</p>
<ul>
<li>Le <a href="http://www.developpez.net/forums/f1699/applications/projets/projets-heberges/eric/" target="_blank">forum</a> hébergé par developpez.net</li>
<li>Le <a href="http://subversion.developpez.com/projets/ERic/trunk/" target="_blank">dépôt SVN</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MorphOS 2.5 disponible aujourd&#8217;hui</title>
		<link>https://blog.developpez.com/damien-guichard/p8974/divers/morphos_2_5_disponible_aujourd_hui</link>
		<comments>https://blog.developpez.com/damien-guichard/p8974/divers/morphos_2_5_disponible_aujourd_hui#comments</comments>
		<pubDate>Fri, 04 Jun 2010 08:40:20 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Divers]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le système d&#8217;exploitation MorphOS, un OS léger et convivial descendant de feu AmigaOS est enfin disponible en version 2.5 sur matériel Apple, eMac, Mac mini G4, en plus des plateformes déjà supportées (Pegasos 1 &#38; 2 et EFIKA). La procédure d&#8217;enregistrement de MorphOS 2.5 est intégrée à la version de démonstration et consiste à : installer la version de démonstration librement téléchargeable utiliser l&#8217;outil RegTool pour s&#8217;enregistrer le paiement s&#8217;effectue à l&#8217;aide de PayPal Les [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://www.morphos-team.net" target="_blank"><img src="http://www.morphos-team.net/graphic_2blue2betrue.png"/></a></center></p>
<p>Le système d&rsquo;exploitation <a href="http://www.morphos-team.net" target="_blank">MorphOS</a>, un OS léger et convivial descendant de feu AmigaOS est enfin disponible en version 2.5 sur matériel Apple, eMac, Mac mini G4, en plus des plateformes déjà supportées (Pegasos 1 &amp; 2 et EFIKA).</p>
<p>La procédure d&rsquo;enregistrement de MorphOS 2.5 est intégrée à la version de démonstration et consiste à :</p>
<ul>
<li>installer la <a href="http://www.morphos-team.net/downloads.html" target="_blank">version de démonstration</a> librement téléchargeable</li>
<li>utiliser l&rsquo;outil RegTool pour s&rsquo;enregistrer</li>
<li>le paiement s&rsquo;effectue à l&rsquo;aide de PayPal</li>
</ul>
<p>Les conditions d&rsquo;utilisation assez restrictives (la licence est liée au matériel) sont destinées à limiter le piratage. Espérons que cela n&rsquo;empêchera pas les passionnés d&rsquo;informatique alternative de découvrir ce système plein d&rsquo;atouts pour ne pas dire culte puisqu&rsquo;il a le don de déclencher un attachement que certains qualifient d&rsquo;irrationnel. </p>
<p><img src="http://damien-guichard.developpez.com/logos/button_warning.gif"/> L&rsquo;installation par défaut écrase toutes les données du disque, pour installer MorphOS 2.5 en multi-boot sur Mac Mini reportez vous à <a href="http://dreamolers.binaryriot.org/dualboot.pdf" target="_blank">ces instructions</a>. </p>
<p>Renseignez-vous sur <a href="http://www.morphos.de/intro.html" target="_blank">MorphOS</a> et l&rsquo;Amiga :</p>
<ul>
<li>visitez <a href="http://www.meta-morphos.org/" target="_blank">le site d&rsquo;un utilisateur</a> satisfait par MorphOS</li>
<li>visitez <a href="http://www.amigaimpact.org/" target="_blank">un site de fans de cette machine mythique qu&rsquo;est l&rsquo;Amiga</a></li>
<li>adhérez <a href="http://www.developpez.net/forums/group.php?groupid=192" target="_blank">au groupe DVP des utilisateurs d&rsquo;Amiga et compatibles</a></li>
<li><a href="http://obligement.free.fr/articles/amiga_histoire_1985.php" target="_blank">apprenez la fabuleuse histoire de l&rsquo;Amiga</a>, découvrez des personnages hauts en couleur comme <a href="http://obligement.free.fr/articles/amiga_histoire_1982.php" target="_blank"> Jay Miner</a>, son chien Mitchy, et revivez la passion de l&rsquo;informatique comme elle ne sera plus jamais</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Types Abstraits généralisés</title>
		<link>https://blog.developpez.com/damien-guichard/p8967/programmation-fonctionnelle/types_abstraits_generalises</link>
		<comments>https://blog.developpez.com/damien-guichard/p8967/programmation-fonctionnelle/types_abstraits_generalises#comments</comments>
		<pubDate>Wed, 02 Jun 2010 15:59:13 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Programmation fonctionnelle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Si vous ne l&#8217;avez pas déjà fait dépêchez-vous de visionner ou de télécharger la vidéo conférence de Heinrich Apfelmus sur les GADTs (Generalized Algebraic Data Types).]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://haskell.org/" target="_blank"><img src="http://haskell.org/sitewiki/images/a/a8/Haskell-logo-60.png"/></a></center></p>
<p>Si vous ne l&rsquo;avez pas déjà fait dépêchez-vous de visionner ou de télécharger<br />
<a href="http://www.archive.org/details/ExplanationOfGeneralizedAlgebraicDataTypesgadts" target="_blank">la vidéo conférence</a> de <a href="http://apfelmus.nfshost.com/" target="_blank">Heinrich Apfelmus</a> sur les GADTs (Generalized Algebraic Data Types).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Méditation sur une calculatrice</title>
		<link>https://blog.developpez.com/damien-guichard/p8966/programmation-fonctionnelle/meditation_sur_une_calculatrice</link>
		<comments>https://blog.developpez.com/damien-guichard/p8966/programmation-fonctionnelle/meditation_sur_une_calculatrice#comments</comments>
		<pubDate>Wed, 02 Jun 2010 13:53:42 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Objective Caml]]></category>
		<category><![CDATA[Programmation fonctionnelle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un exercice simple pour débutant en ocaml c&#8217;est d&#8217;écrire un interpréteur pour un petit langage simple comme par exemple une calculatrice : type arithmetic = &#124; Cst of int &#124; Neg of arithmetic &#124; Add of binary &#124; Sub of binary &#124; Mul of binary &#124; Div of binary and binary = arithmetic * arithmetic Mais cet exercice anodin change complètement de nature quand on passe à un langage fortement normalisant, dans ce cas vous [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://caml.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_caml.png"/></a></center></p>
<p>Un exercice simple pour débutant en ocaml c&rsquo;est d&rsquo;écrire un interpréteur pour un petit langage simple comme par exemple une calculatrice :</p>
<pre>
type arithmetic =
   | Cst of int
   | Neg of arithmetic
   | Add of binary
   | Sub of binary
   | Mul of binary
   | Div of binary
and binary =
   arithmetic * arithmetic
</pre>
<p>Mais cet exercice anodin change complètement de nature quand on passe à un langage fortement normalisant, dans ce cas vous devez aussi prouver que le programme se termine toujours et sans accident, quelles que soient les circonstances.    </p>
<p><span id="more-28"></span></p>
<p>Cette preuve ce fait en deux étapes :</p>
<ul>
<li>d&rsquo;abord il changer d&rsquo;algèbre initiale</li>
<li>ensuite il faut établir une égalité entre les deux types algébriques</li>
</ul>
<p>Le changement d&rsquo;algèbre initiale se fait en paraphrasant la déclaration du type, en remplaçant chaque occurrence de <em>arithmetic</em> par une occurrence de <em>fold f</em> :</p>
<pre>
let rec fold f = function
   | Cst n -> f#cst n 
   | Neg a -> f#neg (fold f a)
   | Add (a,b) -> f#add (fold f a) (fold f b)
   | Sub (a,b) -> f#sub (fold f a) (fold f b)
   | Mul (a,b) -> f#mul (fold f a) (fold f b)
   | Div (a,b) -> f#div (fold f a) (fold f b)
</pre>
<p>Le paramètre <em>f</em> est une égalité entre les deux types algébriques :       </p>
<pre>
let id x = x   
   
let eval =
   fold (
      object
         method cst = id
         method neg = (~-)
         method add = ( + )
         method sub = ( - ) 
         method mul = ( * ) 
         method div = ( / )
      end )
</pre>
<p>À cette étape on est à l&rsquo;abri des boucles infinies.<br />
Mais on n&rsquo;est pas à l&rsquo;abri des interruptions intempestives, par exemple lors d&rsquo;une division par zéro.    </p>
<pre>
# eval (Div(Cst 1,Cst 0));;
Exception: Division_by_zero.
</pre>
<p>Dans les langages fortements normalisants les exceptions n&rsquo;existent pas.<br />
Pour simuler les exceptions on utilise la monade <em>result</em> pour propager le diagnostic d&rsquo;erreur.</p>
<pre>
type ('a,'b) result =
   | Ok of 'a
   | Error of 'b 

let ok1 f v =
   match v with
   | Ok x -> Ok (f x)
   | Error _ -> v

let ok2 f v1 v2 =
   match v1,v2 with
   | Ok x1,Ok x2 -> Ok (f x1 x2) 
   | Error _, _ -> v1
   | _, Error _ -> v2

let result2 f v1 v2 =
   match v1,v2 with
   | Ok x1,Ok x2 -> f x1 x2 
   | Error _, _ -> v1
   | _, Error _ -> v2
   
let safe_division a b =  
   if b=0 then Error "Division_by_zero"
   else Ok (a/b)  
</pre>
<p>À l&rsquo;aide de cette monade <em>result</em> on peut définir une nouvelle égalité qui prend en compte les possibilités d&rsquo;erreur :  </p>
<pre>
let ok n = Ok n   
      
let eval =
   fold (
      object
         method cst = ok
         method neg = ok1 (~-)
         method add = ok2 ( + )
         method sub = ok2 ( - ) 
         method mul = ok2 ( * ) 
         method div = result2 safe_division
      end )
</pre>
<p>Cette fois le programme suit son cours jusqu&rsquo;au bout, sans interruption :</p>
<pre>
# eval (Div(Cst 1,Cst 0));;
- : (int, string) result = Error "Division_by_zero"      
</pre>
<p>Bien sûr un tel raffinement de style n&rsquo;est pas forcément utile ou même désirable dans chaque code ocaml. Le langage étant multi-paradigmes par nature il vous invite à trouver le style qui vous convient le mieux.</p>
<p>Cependant, avec cette introduction courte et informelle sur les récurseurs et les monades, j&rsquo;espère avoir donné quelques encouragements à ceux qui voudraient faire le grand saut vers un assistant de preuve.</p>
<p>&#8211; damien</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plus de logos pour Rox-Filer</title>
		<link>https://blog.developpez.com/damien-guichard/p8809/programmation-fonctionnelle/plus_de_logos_pour_rox_filer_1</link>
		<comments>https://blog.developpez.com/damien-guichard/p8809/programmation-fonctionnelle/plus_de_logos_pour_rox_filer_1#comments</comments>
		<pubDate>Sat, 10 Apr 2010 14:45:20 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Programmation fonctionnelle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans un précédent billet je vous expliquais comment créer un MIME pour les sources dans votre langage de programmation favori. Un MIME (Multipurpose Internet Mail Extension) est une information système pour identifier les types de fichier et leur affecter certains attributs comme une commande par défaut ou une icône personnalisée. Dans ce billet je vais encore plus loin en vous proposant directement un panel d&#8217;icônes taillées sur mesure pour le gestionnaire de fichiers ROX-Filer. Bien [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans un <a href="http://blog.developpez.com/damien-guichard/p8578/logiciel-libre/linux/personnalisez-vos-fichiers-source/#more8578" target="_blank">précédent billet</a> je vous expliquais comment créer un MIME pour les sources dans votre langage de programmation favori. </p>
<p>Un MIME (Multipurpose Internet Mail Extension) est une information système pour identifier les types de fichier et leur affecter certains attributs comme une commande par défaut ou une icône personnalisée.  </p>
<p>Dans ce billet je vais encore plus loin en vous proposant directement un panel d&rsquo;icônes taillées sur mesure pour le gestionnaire de fichiers <a href="http://fr.wikipedia.org/wiki/ROX-Filer" target="_blank">ROX-Filer</a>.</p>
<ul>
<li><a href="http://caml.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_caml.png"/></a>
</li>
<li><a href="http://haskell.org/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_haskell.png"/></a>
</li>
<li><a href="http://coq.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_coq1.png"/></a><a href="http://coq.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_coq2.png"/></a><a href="http://coq.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_coq3.png"/></a><a href="http://coq.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_coq4.png"/></a><a href="http://coq.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_coq5.png"/></a>
</li>
<li><a href="http://www.schemers.org/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_scheme.png"/></a>
</li>
<li><a href="http://fr.wikipedia.org/wiki/Lisp" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_lisp1.png"/></a>
</li>
<li><a href="http://www.scala-lang.org/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_scala1.png"/></a>
</li>
<li><a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_Fsharp.png"/></a>
</li>
</ul>
<p>Bien sûr si vous semblez frappé d&rsquo;injustice du fait que votre langage de programmation favori ne soit pas représenté, vous pouvez me faire une proposition que j&rsquo;ajouterai pour élargir la gamme de fichiers sources personnalisables.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Raincat, le chaton craintif</title>
		<link>https://blog.developpez.com/damien-guichard/p8795/programmation-fonctionnelle/raincat_le_chaton_craintif</link>
		<comments>https://blog.developpez.com/damien-guichard/p8795/programmation-fonctionnelle/raincat_le_chaton_craintif#comments</comments>
		<pubDate>Mon, 05 Apr 2010 19:01:41 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Logiciel Libre]]></category>
		<category><![CDATA[Programmation fonctionnelle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce n&#8217;est pas la première fois que je vous parle de jeu-vidéo et de programmation fonctionnelle. Cette fois il s&#8217;agit de Raincat, un jeu SDL écrit en Haskell, pour Windows et Linux. Le jeu consiste à déposer les accessoires (dans la colonne à droite) sur le parcours du chaton afin que celui-ci atteigne la sortie du niveau malgré la pluie et diverses projections d&#8217;eau. Car le Raincat est réellement hydrophobe, la moindre goutte sur son [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://haskell.org/" target="_blank"><img src="http://haskell.org/sitewiki/images/a/a8/Haskell-logo-60.png"/></a></center></p>
<p>Ce n&rsquo;est pas la première fois que je vous parle de jeu-vidéo et de programmation fonctionnelle.<br />
Cette fois il s&rsquo;agit de <a href="http://bysusanlin.com/raincat/" target="_blank">Raincat</a>, un jeu SDL écrit en <a href="http://haskell.org/" target="_blank">Haskell</a>, pour Windows et Linux.</p>
<p><center><img src="http://damien-guichard.developpez.com/illustrations/developpez_0107.jpg"/></center></p>
<p>Le jeu consiste à déposer les accessoires (dans la colonne à droite) sur le parcours du chaton afin que celui-ci atteigne la sortie du niveau malgré la pluie et diverses projections d&rsquo;eau. Car le Raincat est réellement hydrophobe, la moindre goutte sur son pelage délicat et vous devrez recommencer le niveau.</p>
<p>À vrai dire ce petit puzzle ne m&rsquo;a pas rendu accro. Maintenir un chaton propre et toujours au sec m&rsquo;apparaît difficilement comme un enjeu ludique motivant.  </p>
<p>Ce qui est peut être plus intéressant que le jeu en lui-même c&rsquo;est le témoignage que le fossé qui séparaient les langages académiques des applications quotidiennes se comble de jours en jours.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OCaml Meeting 2010 à Paris le 16 Avril</title>
		<link>https://blog.developpez.com/damien-guichard/p8721/programmation-fonctionnelle/ocaml_meeting_2010_a_paris_le_16_avril</link>
		<comments>https://blog.developpez.com/damien-guichard/p8721/programmation-fonctionnelle/ocaml_meeting_2010_a_paris_le_16_avril#comments</comments>
		<pubDate>Fri, 12 Mar 2010 16:23:33 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Objective Caml]]></category>
		<category><![CDATA[Programmation fonctionnelle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Sylvain Le Gall et l&#8217;équipe organisatrice de la 3ième rencontre des programmeurs Objective-Caml vous donnent rendez-vous le 16 Avril à Paris. Malheureusement je ne pourrai pas être présent cette année. Hello, For the third time, I am proud to invite all OCaml enthusiasts to join us at OCaml Meeting 2010 in Paris. This year event takes place in Paris on Friday 16th April 2010. Subscription is opened and will be closed on Friday 2nd April [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://caml.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_caml.png"/></a></center></p>
<p><strong>Sylvain Le Gall</strong> et l&rsquo;équipe organisatrice de la 3ième rencontre des programmeurs Objective-Caml vous donnent rendez-vous le 16 Avril à Paris.</p>
<p>Malheureusement je ne pourrai pas être présent cette année. </p>
<p><span id="more-27"></span></p>
<p>Hello,</p>
<p>For the third time, I am proud to invite all OCaml enthusiasts to join<br />
us at OCaml Meeting 2010 in Paris.</p>
<p>This year event takes place in Paris on Friday 16th April 2010.<br />
Subscription is opened and will be closed on Friday 2nd April 2010.</p>
<p>Presentations include:</p>
<ul>
<li>Enforcing Type-Safe Linking using Inter-Package Relationships for<br />
  OCaml Debian packages</li>
<li>The Ocamlviz visualization toolkit</li>
<li>Cluster computing in Ocaml</li>
<li>Ocaml in a web startup</li>
<li>React, functional reactive programming for OCaml</li>
<li>OASIS, a Cabal like system for OCaml</li>
<li>OPA, same web, but with types and lambda</li>
<li>OC4MC, Objective Caml for MultiCore</li>
<li>Lwt, Cooperative Light-Weight Threads</li>
<li>naclgrid: the collaborative rendering farm, a JoCaml-powered<br />
  desktop grid</li>
</ul>
<p>The meeting is sponsored by INRIA, the Caml Consortium and OCamlCore.<br />
Inscription is free but the number of participants is limited.</p>
<p>Further information and inscriptions:</p>
<p>http://wiki.cocan.org/events/europe/ocamlmeetingparis2010</p>
<p>The day after OCaml Meeting, Mehdi Dogguy from PPS helps me to organize<br />
an informal day where OCaml teams can meet to work. We will have 2<br />
classrooms, each can host 45 persons. There will be an internet access<br />
and a blackboard in each room. Inscription is free.</p>
<p>Further information and inscriptions:</p>
<p>http://wiki.cocan.org/events/europe/ocamlhackingday2010</p>
<p>Hope to see a lot of you,</p>
<p>Regards,</p>
<p><strong>Sylvain Le Gall</strong> on behalf of the OCaml Meeting organization team.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les files de priorité (les bases)</title>
		<link>https://blog.developpez.com/damien-guichard/p8644/programmation-fonctionnelle/les_files_de_priorite_les_bases</link>
		<comments>https://blog.developpez.com/damien-guichard/p8644/programmation-fonctionnelle/les_files_de_priorite_les_bases#comments</comments>
		<pubDate>Thu, 18 Feb 2010 16:54:03 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Objective Caml]]></category>
		<category><![CDATA[Programmation fonctionnelle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le tas binaire est un tableau qui implémente un arbre pseudo-complet vérifiant la propriété de tas. Un tableau est de taille fixe. Par conséquent un tas binaire est borné, on ne peut y insérer qu&#8217;un nombre fixe et limité d&#8217;éléments. Bien sûr on pourrait redimensionner le tableau dynamiquement, mais cela a un impact négatif sur le coût des opérations. Qu&#8217;on prêche le style impératif ou le style fonctionnel est étrangé à l&#8217;affaire. La bonne question [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://caml.inria.fr/" target="_blank"><img src="http://damien-guichard.developpez.com/logos/logo_caml.png"/></a></center></p>
<p>Le tas binaire est un tableau qui implémente un arbre pseudo-complet vérifiant la propriété de tas.<br />
Un tableau est de taille fixe. Par conséquent un tas binaire est borné, on ne peut y insérer qu&rsquo;un nombre fixe et limité d&rsquo;éléments. Bien sûr on pourrait redimensionner le tableau dynamiquement, mais cela a un impact négatif sur le coût des opérations.<br />
Qu&rsquo;on prêche le style impératif ou le style fonctionnel est étrangé à l&rsquo;affaire.<br />
La bonne question c&rsquo;est de savoir si on connait d&rsquo;avance le nombre d&rsquo;éléments à insérer ou non. </p>
<p>Si on le connait alors un tas binaire fera très bien l&rsquo;affaire.<br />
Si on ne le connait pas, alors autant opter tout de suite pour un arbre binaire, même si on veut garder un style impératif.<br />
Ça serait exactement la même problématique avec un dictionnaire. On peut faire une recherche dichotomique dans un tableau trié. Ou alors on peut faire une recherche dans un arbre ordonnée.<br />
Dans les deux cas l&rsquo;algorithme de recherche est le même, il s&rsquo;agit dune boucle qui à chaque étape découpe l&rsquo;espace de recherche en deux moitiés dont une seule peut contenir l&rsquo;élément recherché.<br />
Le paradigme a bien un impact sur le programmeur mais c&rsquo;est parce que le programmeur est trop attaché à la syntaxe.<br />
En réalité le paradigme impacte plus fortement la façon de faire que la façon de penser.<br />
L&rsquo;expérience aussi est un facteur qui impacte la façon de faire.<br />
C&rsquo;est pourquoi je préfère parler de style plutôt que de paradigme.</p>
<p><span id="more-26"></span></p>
<h3 style="text-align: left">Le tas de Braun</h3>
<p>Un petit rappel de quelques définitions :</p>
<ul>
<li><a href="http://algo.developpez.com/faq/?page=types#structure_de_tas" target="_blank">propriété de tas</a></li>
<li><a href="http://algo.developpez.com/faq/?page=arbres#arbre_binaire_complet" target="_blank">arbre complet</a></li>
<li><a href="http://algo.developpez.com/faq/?page=arbres#arbre_braun" target="_blank">arbre de Braun</a></li>
</ul>
<p>On l&rsquo;appelle tas de Braun parce que l&rsquo;insertion répétée dans l&rsquo;arbre vide produit un arbre de Braun.<br />
Un autre nom est <em>heap-ordered binary tree</em> mais c&rsquo;est moins spécifique.</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">type 'a heap = <br />
&nbsp; | E (* 'a empty heap *) <br />
&nbsp; | N of 'a non_empty_heap <br />
and 'a non_empty_heap = <br />
&nbsp; {mutable l: 'a heap; mutable e: 'a; mutable r: 'a heap}</div></div>

</pre>
<p>Remarques :</p>
<ul>
<li>on a un type tas non-vide, il n&rsquo;y aura pas d&rsquo;exceptions dans le code, la contrainte sur l&rsquo;argument des fonctions <em>find_max</em> et <em>remove_max</em> sera exprimée par le type, la contrainte sur le résultat de <em>insert</em> également</li>
<li>les champs sont mutables, c&rsquo;est parce qu&rsquo;on va utiliser le même type pour les deux styles de programmation, les algorithmes seront les mêmes, mais dans un cas on fera de la copie, dans l&rsquo;autre on fera de la modification sur place</li>
</ul>
<p>La fonction <em>find_max</em> est triviale :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">let find_max {e=m} = m</div></div>
<h3 style="text-align: left">Le style fonctionnel</h3>
<p>On devrait dire le style immutable.<br />
Je commence toujours par le style immutable parce que c&rsquo;est plus lisible.<br />
J&rsquo;ai choisi un tas-max plutôt qu&rsquo;un tas-min, pour un tas-min il n&rsquo;y aura qu&rsquo;à changer le signe où inverser le signe de la fonction <em>compare</em>.</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">let rec add x = function <br />
&nbsp; | E -&gt; <br />
&nbsp; &nbsp; &nbsp; {l=E;e=x;r=E} <br />
&nbsp; | N n -&gt; &nbsp;<br />
&nbsp; &nbsp; &nbsp; if compare n.e x &gt; 0 then {l=N (add x n.r);e=n.e;r=n.l} &nbsp;<br />
&nbsp; &nbsp; &nbsp; else {l=N (add n.e n.r);e=x;r=n.l} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
let rec remove_max = function <br />
&nbsp; | {l=E;r=t} | {r=E;l=t} -&gt; <br />
&nbsp; &nbsp; &nbsp; t <br />
&nbsp; | {l=N l;e=e;r=N r} -&gt; <br />
&nbsp; &nbsp; &nbsp; if compare l.e r.e &gt; 0 then N {l=remove_max l;e=l.e;r=N r} <br />
&nbsp; &nbsp; &nbsp; else N {l=N l;e=r.e;r=remove_max r}</div></div>

</pre>
<h3 style="text-align: left">Le style impératif</h3>
<p>On devrait dire le style mutable.<br />
Je traduis à partir de la version en style immutable.</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">let rec insert x = function <br />
&nbsp; | E -&gt; <br />
&nbsp; &nbsp; &nbsp; {l=E;e=x;r=E} <br />
&nbsp; | N n -&gt; <br />
&nbsp; &nbsp; &nbsp; let nr = n.r in <br />
&nbsp; &nbsp; &nbsp; n.r &lt;- n.l; <br />
&nbsp; &nbsp; &nbsp; if compare n.e x &gt; 0 then n.l &lt;- N (insert x nr) <br />
&nbsp; &nbsp; &nbsp; else (n.l &lt;- N (insert n.e nr); n.e &lt;- x); <br />
&nbsp; &nbsp; &nbsp; n <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
let rec delete_max h = <br />
&nbsp; match h with &nbsp;<br />
&nbsp; | {l=E;r=t} | {r=E;l=t} -&gt; <br />
&nbsp; &nbsp; &nbsp; t <br />
&nbsp; | {l=N l;e=e;r=N r} -&gt; <br />
&nbsp; &nbsp; &nbsp; if compare l.e r.e &gt; 0 then (h.e &lt;- l.e; h.l &lt;- delete_max l) &nbsp;<br />
&nbsp; &nbsp; &nbsp; else (h.e &lt;- r.e; h.r &lt;- delete_max r); <br />
&nbsp; &nbsp; &nbsp; N h</div></div>

</pre>
<h3 style="text-align: left">Autres opérations</h3>
<p>Il faut mentionner qu&rsquo;un tas de Braun offre des tas de possibilités de variantes et d&rsquo;extensions qui seraient bien plus difficiles à implanter à l&rsquo;aide d&rsquo;un tas binaire.<br />
Je ne vais pas être exhaustif sur ce point, je vais cependant en citer deux.<br />
Il est également possible de supprimer un élément arbitraire dans un tas en le faissant percoler jusqu&rsquo;à la racine puis en invoquant <em>remove_max</em>.</p>
<h3 style="text-align: left">La fusion </h3>
<p>Il est possible de fusionner deux tas de Braun en un seul tas.</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">let rec join ha hb = <br />
&nbsp; match ha,hb with <br />
&nbsp; | t,E | E,t -&gt; <br />
&nbsp; &nbsp; &nbsp; t <br />
&nbsp; | N a,N b -&gt; <br />
&nbsp; &nbsp; &nbsp; if compare a.e b.e &gt; 0 then N {l=join a.l a.r;e=a.e;r=hb} <br />
&nbsp; &nbsp; &nbsp; else N {l=ha;e=b.e;r=join b.l b.r}</div></div>

</pre>
<p>On peut accélérer l&rsquo;opération de fusion à l&rsquo;aide d&rsquo;une technique dite de &laquo;&nbsp;structural bootstrapping&nbsp;&raquo;.<br />
Grâce à cette technique il est possible de fusionner deux tas simplement en insérant l&rsquo;un dans l&rsquo;autre.</p>
<h3 style="text-align: left">L&rsquo;arbre tournoi</h3>
<p>On peut modifier légèrement les opérations d&rsquo;insertion et de suppression pour que le tas restitue l&rsquo;ordre d&rsquo;insertion quand on le parcourre dans l&rsquo;ordre infixe.<br />
Toutefois cette modification a un impact sur la performance, le tas n&rsquo;est plus pseudo-complet comme un arbre de Braun.  </p>
<p>Typiquement on insère les scores dans l&rsquo;arbre tournoi, le gagnant est toujours à la racine.<br />
Le parcourt infixe restitue la liste des scores dans l&rsquo;ordre d&rsquo;apparition des joueurs.</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">let rec add x = function <br />
&nbsp; | E -&gt; <br />
&nbsp; &nbsp; &nbsp; {l=E;e=x;r=E} <br />
&nbsp; | N n -&gt; &nbsp;<br />
&nbsp; &nbsp; &nbsp; if compare n.e x &gt; 0 then {n with r=N (add x n.r)} &nbsp;<br />
&nbsp; &nbsp; &nbsp; else {l=N n;e=x;r=E} <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
let rec remove_max = function <br />
&nbsp; | {l=E;r=t} | {r=E;l=t} -&gt; <br />
&nbsp; &nbsp; &nbsp; t <br />
&nbsp; | {l=N l;e=e;r=N r} as t -&gt; <br />
&nbsp; &nbsp; &nbsp; if compare l.e r.e &gt; 0 then <br />
&nbsp; &nbsp; &nbsp; &nbsp; N{l=l.l;e=l.e;r=remove_max {t with l=l.r}} <br />
&nbsp; &nbsp; &nbsp; else <br />
&nbsp; &nbsp; &nbsp; &nbsp; N{l=remove_max {t with r=r.l};e=r.e;r=r.r}</div></div>

</pre>
<h3 style="text-align: left">Conclusion</h3>
<p>La chose à retenir c&rsquo;est que ce n&rsquo;est pas le fonctionnel qui force à changer de structure de données.<br />
Ce qui force à changer de structure de données c&rsquo;est le fait qu&rsquo;un tableau n&rsquo;est pas toujours la meilleure option. Utiliser une liste ou un arbre au lieu d&rsquo;un tableau n&rsquo;interdit pas le style mutable.<br />
Il n&rsquo;y a pas un paradigme impératif qui s&rsquo;oppose à un paradigme impératif fonctionnel, il y a juste le style mutable et le style immutable qui sont deux façons d&rsquo;implanter un même algorithme pour une même structure de données.<br />
On peut d&rsquo;ailleurs très bien adopter le style immutable avec un langage à objets si le ramasse-miettes est suffisamment efficace pour ça.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
