<?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, 02 Mar 2011 22:17:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Supprimer toutes les instances d&#039;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'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'un caractère donné dans une chaîne, en Haskell... en une ligne, oui. Il s'agit donc par exemple de pouvoir supprimer tous [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p>J'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'un caractère donné dans une chaîne, en Haskell... en une ligne, oui.<br />
Il s'agit donc par exemple de pouvoir supprimer tous les 'a' dans (je vais faire dans l'original) le titre de ce billet !</p>
<p>"Supprimer toutes les instances d'un caractère dans une chaîne en Haskell"<br />
doit donc devenir :<br />
"Supprimer toutes les instnces d'un crctère dns une chîne en Hskell"</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'est bien ce que l'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'un argument qui retourne un booléen) et qui s'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'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 "s" alors que l'on peut s'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'est définissable qu'avec filter et l'opérateur /= ... 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'est presque qu'un enchainement de compositions de fonctions, de sorte qu'une ligne ne soit presque qu'une phrase, si l'on nomme bien les fonctions. </p>
<p>Je rappelle que le '.' est tout simplement l'opérateur de composition de fonctions, et il suffit de regarder son type pour s'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'opérateur <em>.</em> prend deux fonctions, l'une (disons g) du type b vers le type c, l'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'est exactement ce que fait l'opérateur '<em>o</em>' 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'on peut télécharger compilateur, interpréteur, outils &#038; bibliothèques divers et variés mais également consulter des tutoriels/cours sur Haskell  - c'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 'Real World Haskell' 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>1637</slash:comments>
		</item>
	</channel>
</rss>

