<?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>Coder-Studio &#187; caractères</title>
	<atom:link href="http://www.coder-studio.com/blog/tag/caracteres/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coder-studio.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 31 Mar 2010 00:00:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Supprimer toutes les instances d&#8217;un caractère dans une chaîne en Haskell</title>
		<link>http://www.coder-studio.com/blog/supprimer-toutes-les-instances-dun-caractere-dans-une-chaine-en-haskell/</link>
		<comments>http://www.coder-studio.com/blog/supprimer-toutes-les-instances-dun-caractere-dans-une-chaine-en-haskell/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 08:10:17 +0000</pubDate>
		<dc:creator>Alp Mestan</dc:creator>
				<category><![CDATA[Langages fonctionnels]]></category>
		<category><![CDATA[caractères]]></category>
		<category><![CDATA[chaînes]]></category>
		<category><![CDATA[fonctionnel]]></category>
		<category><![CDATA[haskell]]></category>

		<guid isPermaLink="false">http://r19649.ovh.net/cs/blog/?p=80</guid>
		<description><![CDATA[Bonjour,
J&#8217;inaugure mon compte sur ce blog en y postant mon premier billet, sur Haskell qui plus est !
Je vais vous montrer puis vous expliquer un moyen simple de supprimer toutes les instances d&#8217;un caractère donné dans une chaîne, en Haskell&#8230; en une ligne, oui.
Il s&#8217;agit donc par exemple de pouvoir supprimer tous les &#8216;a&#8217; dans [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p>J&#8217;inaugure mon compte sur ce blog en y postant mon premier billet, sur Haskell qui plus est !</p>
<p>Je vais vous montrer puis vous expliquer un moyen simple de supprimer toutes les instances d&#8217;un caractère donné dans une chaîne, en Haskell&#8230; en une ligne, oui.<br />
Il s&#8217;agit donc par exemple de pouvoir supprimer tous les &#8216;a&#8217; dans (je vais faire dans l&#8217;original) le titre de ce billet !</p>
<p>&laquo;&nbsp;Supprimer toutes les instances d&#8217;un caractère dans une chaîne en Haskell&nbsp;&raquo;<br />
doit donc devenir :<br />
&laquo;&nbsp;Supprimer toutes les instnces d&#8217;un crctère dns une chîne en Hskell&nbsp;&raquo;</p>
<p><span id="more-80"></span></p>
<p>Voici comment faire, en utilisant la fonction filter que nous expliquerons plus bas.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p80code6'); return false;">View Code</a> HASKELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p806"><td class="code" id="p80code6"><pre class="haskell" style="font-family:monospace;">strip <span style="color: #339933; font-weight: bold;">::</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Char"><span style="color: #cccc00; font-weight: bold;">Char</span></a> <span style="color: #339933; font-weight: bold;">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:String"><span style="color: #cccc00; font-weight: bold;">String</span></a> <span style="color: #339933; font-weight: bold;">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:String"><span style="color: #cccc00; font-weight: bold;">String</span></a>
strip c s <span style="color: #339933; font-weight: bold;">=</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:filter"><span style="font-weight: bold;">filter</span></a> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">/=</span> c<span style="color: green;">&#41;</span> s</pre></td></tr></table></div>

<p>Premièrement, regardons le type de cette fonction.<br />
Elle prend a deux arguments : un caractère et une chaîne de caractères (qui, en Haskell, est définie comme une liste de caractères <em>[Char]</em>). Elle retourne une chaîne de caractères ; c&#8217;est bien ce que l&#8217;on désire.</p>
<p>Regardons ensuite la seconde ligne : <em>c</em> désigne le fameux caractère à supprimer et <em>s</em> la chaîne dans laquelle le supprimer.</p>
<p>Nous faisons ensuite appel à la fonction filter qui prend un prédicat à un argument (une fonction d&#8217;un argument qui retourne un booléen) et qui s&#8217;applique ensuite sur une liste, donnée en second argument. Elle retourne une liste où seuls les éléments vérifiant le prédicat sont restés. Je tiens à rappeler que Haskell étant un langage fonctionnel, on ne modifie pas la liste, on en retourne une nouvelle. N&#8217;ayez crainte, ça ne va pas faire des programme lourd, il y a de belles optimisations qui tournent derrière.</p>
<p>Mettez le code précédent dans un fichier strip.hs par exemple, et chargez-le dans GHCi via <em>:load strip.hs</em> (en vous assurant que vous êtes dans le bon répertoire). Puis testons :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p80code7'); return false;">View Code</a> PRELUDE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p807"><td class="code" id="p80code7"><pre class="prelude" style="font-family:monospace;">*Main&gt; strip 'a' &quot;Supprimer toutes les instances d'un caractères dans une chaîne en Haskell&quot;
&quot;Supprimer toutes les instnces d'un crctères dns une chîne en Hskell&quot;</pre></td></tr></table></div>

<p>Notons toutefois que le code ci-dessus peut-être encore plus court !<br />
En effet, nous avons indiqué la chaine &laquo;&nbsp;s&nbsp;&raquo; alors que l&#8217;on peut s&#8217;en passer et écrire cela :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p80code8'); return false;">View Code</a> HASKELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p808"><td class="code" id="p80code8"><pre class="haskell" style="font-family:monospace;">strip <span style="color: #339933; font-weight: bold;">::</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Char"><span style="color: #cccc00; font-weight: bold;">Char</span></a> <span style="color: #339933; font-weight: bold;">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:String"><span style="color: #cccc00; font-weight: bold;">String</span></a> <span style="color: #339933; font-weight: bold;">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:String"><span style="color: #cccc00; font-weight: bold;">String</span></a>
strip c <span style="color: #339933; font-weight: bold;">=</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:filter"><span style="font-weight: bold;">filter</span></a> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">/=</span> c<span style="color: green;">&#41;</span></pre></td></tr></table></div>

<p>Et encore, on sent que strip n&#8217;est définissable qu&#8217;avec filter et l&#8217;opérateur /= &#8230; Et bien tout à fait !</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p80code9'); return false;">View Code</a> HASKELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p809"><td class="code" id="p80code9"><pre class="haskell" style="font-family:monospace;">strip <span style="color: #339933; font-weight: bold;">::</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Char"><span style="color: #cccc00; font-weight: bold;">Char</span></a> <span style="color: #339933; font-weight: bold;">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:String"><span style="color: #cccc00; font-weight: bold;">String</span></a> <span style="color: #339933; font-weight: bold;">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:String"><span style="color: #cccc00; font-weight: bold;">String</span></a>
strip <span style="color: #339933; font-weight: bold;">=</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:filter"><span style="font-weight: bold;">filter</span></a> <span style="color: #339933; font-weight: bold;">.</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">/=</span><span style="color: green;">&#41;</span></pre></td></tr></table></div>

<p>Cette propriété se nomme <strong>êta-réduction</strong> et rend le code bien plus sobre, concis et clair. En effet, en Haskell, après un certain temps, on parvient à écrire du code qui n&#8217;est presque qu&#8217;un enchainement de compositions de fonctions, de sorte qu&#8217;une ligne ne soit presque qu&#8217;une phrase, si l&#8217;on nomme bien les fonctions. </p>
<p>Je rappelle que le &#8216;.&#8217; est tout simplement l&#8217;opérateur de composition de fonctions, et il suffit de regarder son type pour s&#8217;en convaincre :<br />
Tapez <em>:t (.)</em> dans GHCi pour vous en convaincre, il vous dira ceci :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p80code10'); return false;">View Code</a> PRELUDE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p8010"><td class="code" id="p80code10"><pre class="prelude" style="font-family:monospace;">*Main&gt; :t (.)
(.) :: (b -&gt; c) -&gt; (a -&gt; b) -&gt; a -&gt; c</pre></td></tr></table></div>

<p>Ce qui signifie en gros : </p>
<blockquote><p>Pour tous types a, b et c (<em>polymorphisme inside</em>), l&#8217;opérateur <em>.</em> prend deux fonctions, l&#8217;une (disons g) du type b vers le type c, l&#8217;autre (disons f) du type a vers le type b, et elle en fait la composition pour obtenir une fonction qui va du type a vers le type c.</p></blockquote>
<p>C&#8217;est exactement ce que fait l&#8217;opérateur &#8216;<em>o</em>&#8216; en Mathématiques ; en effet, <em>g . f</em> en Haskell est équivalent à <em>g o f</em> en Mathématiques.</p>
<p>Voilà pour mon premier billet ici. </p>
<p>Si vous avez découvert Haskell par ce billet et que vous souhaitez vous y mettre, voici quelques liens essentiels :<br />
<a href="http://www.haskell.org/">http://www.haskell.org/</a> : Site officiel, où l&#8217;on peut télécharger compilateur, interpréteur, outils &#038; bibliothèques divers et variés mais également consulter des tutoriels/cours sur Haskell  &#8211; c&#8217;est le QG de tous les programmeurs Haskell<br />
<a href="http://en.wikibooks.org/wiki/Haskell">http://en.wikibooks.org/wiki/Haskell</a> : Le Wikibook sur Haskell<br />
<a href="http://book.realworldhaskell.org/read/">http://book.realworldhaskell.org/read/</a> : Le livre &#8216;Real World Haskell&#8217; qui est disponible gratuitement en lecture en ligne<br />
Et pour terminer, il y a le salon #haskell (et #haskell.fr, mais ce dernier est peu actif) sur le réseau IRC Freenode.</p>
<p>A bientôt !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/supprimer-toutes-les-instances-dun-caractere-dans-une-chaine-en-haskell/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
