Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2015-06-09T19:07:45+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Typeclass d'un type paramétré, message #606352015-06-09T19:07:45+02:00felko/@felkohttps://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60635<p>Salut,</p>
<p>Désolé de ne pas avoir répondu plus tôt, la nouvelle erreur était facile à régler et n'avait aucun rapport avec mon problème. Finalement je n'ai pas utilisé le code mais ça m'a permis de progresser. Étant encore au début de mon apprentissage de Haskell, je n'ai pas encore lu de tutoriel sur les monades, mais je vois bien que c'est une notion importante.</p>
<p>Sinon vous avez des recommandations pour une librairie graphique de préférence réactive (j'ai entendu parler de la FRP et de Yampa) ? Je passe tout de même le sujet en résolu, merci encore.</p>Typeclass d'un type paramétré, message #603242015-06-07T15:12:30+02:00felko/@felkohttps://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60324<figure><blockquote>
<p>D'après la définition de la classe de types, <code>get</code> est de type <code>FIFOQueue a -> a</code>. Mais <code>head</code> est de type <code>[a] -> a</code>, donc GHC gueule. Pour régler ce problème, il faut que tu définisses tes fonctions d'accès et d'ajout de manière à pouvoir accéder à la liste qui est <em>à l'intérieur</em> de chacune de tes <code>QueueQQCH a</code>. Pour ça, il te faudra définir des fonctions qui permettent de faire <code>QueueQQCH a -> [a]</code> et <code>[a] -> QueueQQCH a</code>, sinon, ça ne peut pas marcher.</p>
</blockquote>
<figcaption><p><a href="http://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60299">Dominus Carnufex</a></p></figcaption></figure><p>Merci pour ta réponse, quand j'ai écris mon premier post, je me suis rendu compte que c'était n'importe quoi, donc j'ai édité mais tu as été plus rapide que moi <img alt=":)" src="/static/smileys/smile.png"></p>
<figure><blockquote>
<p>Comme tu as écrit <code>class Queue q</code>, tout type appartenant à la classe de types <code>Queue</code> est un type qui prend un autre type "en paramètre", autrement dit, c'est un type de <em>kind</em> <code>* -> *</code>(vois ça comme pour les signatures de fonctions, un type qui prend un type et qui retourne un type). GHC couine parce que par exemple, <code>FIFOQueue a</code>est de <em>kind</em> <code>*</code> alors que pour appartenir à la classe de types <code>Queue</code>, il faut avoir un <em>kind</em> de <code>*-> *</code>.<br>
La solution est donc d'écrire:</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre><span class="kr">instance</span> <span class="kt">Queue</span> <span class="kt">FIFOQueue</span> <span class="kr">where</span>
<span class="n">get</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">FIFOQueue</span> <span class="o">$</span> <span class="n">head</span> <span class="n">xs</span>
<span class="n">put</span> <span class="n">elt</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">FIFOQueue</span> <span class="o">$</span> <span class="n">elt</span> <span class="kt">:</span> <span class="n">xs</span>
</pre></div>
</td></tr></table>
</blockquote>
<figcaption><p><a href="http://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60298">Grimur</a></p></figcaption></figure><p>Merci beacoup Grimur, il n'y a plus l'erreur. Cependant une autre est levée par GHC, j'étudie le truc et je vous tiens au courant</p>
<p>Merci à vous pour vos réponses <3</p>Typeclass d'un type paramétré, message #603112015-06-07T13:04:13+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60311<p>J'ai pas testé, mais j'ai vérifié la syntaxe en regardant <code>Maybe</code>. Pour ce que tu disais sur head, une solution serait de définir ses types sous forme d'enregistrements et de composer.</p>Typeclass d'un type paramétré, message #603092015-06-07T12:46:40+02:00Dominus Carnufex/@Dominus%20Carnufexhttps://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60309<p>Parce que les <code>Queue</code> qu'il veut définir se comportent comme des monades, en fait. Cela dit, je pense que ta solution fonctionne, et c'est sûrement le plus élégant. Tu as testé si elle marchait ?</p>Typeclass d'un type paramétré, message #603022015-06-07T12:18:14+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60302<p>Ah oui, bien vu pour le second point Dominus, j'avais pas fait attention.</p>
<p><strong>EDIT</strong>: tu recommandes de lire un guide sur les monades parce que <code>Monad</code> est un type d'ordre supérieur, c'est ça ? Ou parce que le type liste est une monade ? </p>Typeclass d'un type paramétré, message #602992015-06-07T11:58:04+02:00Dominus Carnufex/@Dominus%20Carnufexhttps://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60299<p>EDIT : Grimur a répondu à peu près pareil, mais j'envoie quand même.</p>
<p>Alors, si je ne dis pas de bêtise, il y a deux problèmes.</p>
<p>Premièrement, quand tu définis ta classe…</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre><span class="kr">class</span> <span class="kt">Queue</span> <span class="n">q</span> <span class="kr">where</span>
<span class="n">get</span> <span class="ow">::</span> <span class="n">q</span> <span class="n">a</span> <span class="ow">-></span> <span class="n">a</span>
<span class="n">put</span> <span class="ow">::</span> <span class="n">a</span> <span class="ow">-></span> <span class="n">q</span> <span class="n">a</span> <span class="ow">-></span> <span class="n">q</span> <span class="n">a</span>
</pre></div>
</td></tr></table>
<p>…<code>q</code> est un type paramétré, puisqu'il admet d'être précisé en <code>q a</code>. En revanche, lorsque tu définis tes instances, comme dans…</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span class="kr">instance</span> <span class="kt">Queue</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">a</span><span class="p">)</span> <span class="kr">where</span>
</pre></div>
</td></tr></table>
<p>…tu fournis au constructeur d'instance un type <em>concret</em>. Pour régler ce problème, il faut supprimer le <code> a</code> de toutes tes déclarations d'instances.</p>
<p>Mais alors, tu vas rencontrer une deuxième batterie d'erreurs, et c'est mon deuxièmement. Prenons ta première instance, mais c'est valable pour toutes.</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre><span class="kr">instance</span> <span class="kt">Queue</span> <span class="p">(</span><span class="kt">FIFOQueue</span><span class="p">)</span> <span class="kr">where</span>
<span class="n">get</span> <span class="ow">=</span> <span class="n">head</span>
<span class="n">put</span> <span class="ow">=</span> <span class="p">(</span><span class="kt">:</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p>D'après la définition de la classe de types, <code>get</code> est de type <code>FIFOQueue a -> a</code>. Mais <code>head</code> est de type <code>[a] -> a</code>, donc GHC gueule. Pour régler ce problème, il faut que tu définisses tes fonctions d'accès et d'ajout de manière à pouvoir accéder à la liste qui est <em>à l'intérieur</em> de chacune de tes <code>QueueQQCH a</code>. Pour ça, il te faudra définir des fonctions qui permettent de faire <code>QueueQQCH a -> [a]</code> et <code>[a] -> QueueQQCH a</code>, sinon, ça ne peut pas marcher.</p>
<p>Je t'invite à lire un bon article sur les monades pour mieux comprendre ce deuxième point.</p>Typeclass d'un type paramétré, message #602982015-06-07T11:56:10+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60298<p>Comme tu as écrit <code>class Queue q</code>, tout type appartenant à la classe de types <code>Queue</code> est un type qui prend un autre type "en paramètre", autrement dit, c'est un type de <em>kind</em> <code>* -> *</code>(vois ça comme pour les signatures de fonctions, un type qui prend un type et qui retourne un type). GHC couine parce que par exemple, <code>FIFOQueue a</code>est de <em>kind</em> <code>*</code> alors que pour appartenir à la classe de types <code>Queue</code>, il faut avoir un <em>kind</em> de <code>*-> *</code>.<br>
La solution est donc d'écrire:</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre><span class="kr">instance</span> <span class="kt">Queue</span> <span class="kt">FIFOQueue</span> <span class="kr">where</span>
<span class="n">get</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">FIFOQueue</span> <span class="o">$</span> <span class="n">head</span> <span class="n">xs</span>
<span class="n">put</span> <span class="n">elt</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">FIFOQueue</span> <span class="o">$</span> <span class="n">elt</span> <span class="kt">:</span> <span class="n">xs</span>
</pre></div>
</td></tr></table>Typeclass d'un type paramétré, message #602902015-06-07T11:09:37+02:00felko/@felkohttps://zestedesavoir.com/forums/sujet/3351/typeclass-dun-type-parametre/?page=1#p60290<p>Salut,</p>
<p>J'essaye de faire l'algorithme A* en Haskell pour m'entraîner. Dans cet algorithme on a "besoin" de piles. Du coup, je fais un mini module qui implémente celles ci en Haskell. Le souci c'est que mes types sont paramétrés (e.g. <code>PriorityQueue Int</code> ou <code>FIFOQueue String</code>, etc…) et que je bloque un peu sur la syntaxe des instances de ma <em>typeclass</em> <code>Queue</code>. Voici le code (complet):</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38</pre></div></td><td class="code"><div class="codehilite"><pre><span class="kr">module</span> <span class="nn">Data.Queue</span> <span class="p">(</span>
<span class="kt">Queue</span><span class="p">,</span>
<span class="kt">FIFOQueue</span><span class="p">,</span>
<span class="kt">LIFOQueue</span><span class="p">,</span>
<span class="kt">Deque</span><span class="p">,</span>
<span class="kt">PriorityQueue</span>
<span class="p">)</span> <span class="kr">where</span>
<span class="kr">import</span> <span class="nn">Data.List</span> <span class="p">(</span><span class="nf">maximumBy</span><span class="p">)</span>
<span class="kr">class</span> <span class="kt">Queue</span> <span class="n">q</span> <span class="kr">where</span>
<span class="n">get</span> <span class="ow">::</span> <span class="n">q</span> <span class="n">a</span> <span class="ow">-></span> <span class="n">a</span>
<span class="n">put</span> <span class="ow">::</span> <span class="n">a</span> <span class="ow">-></span> <span class="n">q</span> <span class="n">a</span> <span class="ow">-></span> <span class="n">q</span> <span class="n">a</span>
<span class="kr">data</span> <span class="kt">FIFOQueue</span> <span class="n">a</span> <span class="ow">=</span> <span class="kt">FIFOQueue</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">,</span> <span class="kt">Eq</span><span class="p">)</span>
<span class="kr">data</span> <span class="kt">LIFOQueue</span> <span class="n">a</span> <span class="ow">=</span> <span class="kt">LIFOQueue</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">,</span> <span class="kt">Eq</span><span class="p">)</span>
<span class="kr">data</span> <span class="kt">Deque</span> <span class="n">a</span> <span class="ow">=</span> <span class="kt">Deque</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">,</span> <span class="kt">Eq</span><span class="p">)</span>
<span class="kr">data</span> <span class="kt">PriorityQueue</span> <span class="n">a</span> <span class="ow">=</span> <span class="kt">PriorityQueue</span> <span class="p">[(</span><span class="n">a</span><span class="p">,</span> <span class="kt">Float</span><span class="p">)]</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">,</span> <span class="kt">Eq</span><span class="p">)</span>
<span class="kr">instance</span> <span class="kt">Queue</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">a</span><span class="p">)</span> <span class="kr">where</span>
<span class="n">get</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">FIFOQueue</span> <span class="o">$</span> <span class="n">head</span> <span class="n">xs</span>
<span class="n">put</span> <span class="n">elt</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">FIFOQueue</span> <span class="o">$</span> <span class="n">elt</span> <span class="kt">:</span> <span class="n">xs</span>
<span class="kr">instance</span> <span class="kt">Queue</span> <span class="p">(</span><span class="kt">LIFOQueue</span> <span class="n">a</span><span class="p">)</span> <span class="kr">where</span>
<span class="n">get</span> <span class="p">(</span><span class="kt">LIFOQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">LIFOQueue</span> <span class="o">$</span> <span class="n">head</span> <span class="n">xs</span>
<span class="n">put</span> <span class="n">elt</span> <span class="p">(</span><span class="kt">LIFOQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">LIFOQueue</span> <span class="o">$</span> <span class="n">xs</span> <span class="o">++</span> <span class="p">[</span><span class="n">elt</span><span class="p">]</span>
<span class="kr">instance</span> <span class="kt">Queue</span> <span class="p">(</span><span class="kt">Deque</span> <span class="n">a</span><span class="p">)</span> <span class="kr">where</span>
<span class="n">get</span> <span class="ow">=</span> <span class="n">popLast</span>
<span class="n">put</span> <span class="n">elt</span> <span class="p">(</span><span class="kt">Deque</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">Deque</span> <span class="o">$</span> <span class="n">elt</span> <span class="kt">:</span> <span class="n">xs</span>
<span class="nf">popLast</span><span class="p">,</span> <span class="n">popFirst</span> <span class="ow">::</span> <span class="kt">Deque</span> <span class="n">a</span> <span class="ow">-></span> <span class="n">a</span>
<span class="nf">popLast</span> <span class="p">(</span><span class="kt">Deque</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">Deque</span> <span class="o">$</span> <span class="n">init</span> <span class="n">xs</span>
<span class="nf">popFirst</span> <span class="p">(</span><span class="kt">Deque</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">Deque</span> <span class="o">$</span> <span class="n">tail</span> <span class="n">xs</span>
<span class="kr">instance</span> <span class="kt">Queue</span> <span class="p">(</span><span class="kt">PriorityQueue</span> <span class="n">a</span><span class="p">)</span> <span class="kr">where</span>
<span class="n">get</span> <span class="p">(</span><span class="kt">PriorityQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="n">maximumBy</span> <span class="o">$</span> <span class="p">(</span><span class="n">compare</span> <span class="o">.</span> <span class="n">snd</span><span class="p">)</span> <span class="n">xs</span>
<span class="n">put</span> <span class="n">elt</span> <span class="p">(</span><span class="kt">PriorityQueue</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">PriorityQueue</span> <span class="o">$</span> <span class="n">elt</span> <span class="kt">:</span> <span class="n">xs</span>
</pre></div>
</td></tr></table>
<p>… et voici l'erreur du compilateur:</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19</pre></div></td><td class="code"><div class="codehilite"><pre><span class="kt">Data</span><span class="nf">\</span><span class="kt">Queue</span><span class="o">.</span><span class="n">hs</span><span class="kt">:</span><span class="mi">20</span><span class="kt">:</span><span class="mi">17</span><span class="kt">:</span>
<span class="kt">The</span> <span class="n">first</span> <span class="n">argument</span> <span class="kr">of</span> <span class="p">`</span><span class="kt">Queue'</span> <span class="n">should</span> <span class="n">have</span> <span class="n">kind</span> <span class="p">`</span><span class="o">*</span> <span class="ow">-></span> <span class="o">*</span><span class="sc">'</span><span class="err">,</span>
<span class="n">but</span> <span class="p">`</span><span class="kt">FIFOQueue</span> <span class="n">a'</span> <span class="n">has</span> <span class="n">kind</span> <span class="p">`</span><span class="o">*</span><span class="sc">'</span>
<span class="kt">In</span> <span class="n">the</span> <span class="kr">instance</span> <span class="n">declaration</span> <span class="n">for</span> <span class="p">`</span><span class="kt">Queue</span> <span class="p">(</span><span class="kt">FIFOQueue</span> <span class="n">a</span><span class="p">)</span><span class="sc">'</span>
<span class="kt">Data</span><span class="nf">\</span><span class="kt">Queue</span><span class="o">.</span><span class="n">hs</span><span class="kt">:</span><span class="mi">24</span><span class="kt">:</span><span class="mi">17</span><span class="kt">:</span>
<span class="kt">The</span> <span class="n">first</span> <span class="n">argument</span> <span class="kr">of</span> <span class="p">`</span><span class="kt">Queue'</span> <span class="n">should</span> <span class="n">have</span> <span class="n">kind</span> <span class="p">`</span><span class="o">*</span> <span class="ow">-></span> <span class="o">*</span><span class="sc">'</span><span class="err">,</span>
<span class="n">but</span> <span class="p">`</span><span class="kt">LIFOQueue</span> <span class="n">a'</span> <span class="n">has</span> <span class="n">kind</span> <span class="p">`</span><span class="o">*</span><span class="sc">'</span>
<span class="kt">In</span> <span class="n">the</span> <span class="kr">instance</span> <span class="n">declaration</span> <span class="n">for</span> <span class="p">`</span><span class="kt">Queue</span> <span class="p">(</span><span class="kt">LIFOQueue</span> <span class="n">a</span><span class="p">)</span><span class="sc">'</span>
<span class="kt">Data</span><span class="nf">\</span><span class="kt">Queue</span><span class="o">.</span><span class="n">hs</span><span class="kt">:</span><span class="mi">28</span><span class="kt">:</span><span class="mi">17</span><span class="kt">:</span>
<span class="kt">The</span> <span class="n">first</span> <span class="n">argument</span> <span class="kr">of</span> <span class="p">`</span><span class="kt">Queue'</span> <span class="n">should</span> <span class="n">have</span> <span class="n">kind</span> <span class="p">`</span><span class="o">*</span> <span class="ow">-></span> <span class="o">*</span><span class="sc">'</span><span class="err">,</span>
<span class="n">but</span> <span class="p">`</span><span class="kt">Deque</span> <span class="n">a'</span> <span class="n">has</span> <span class="n">kind</span> <span class="p">`</span><span class="o">*</span><span class="sc">'</span>
<span class="kt">In</span> <span class="n">the</span> <span class="kr">instance</span> <span class="n">declaration</span> <span class="n">for</span> <span class="p">`</span><span class="kt">Queue</span> <span class="p">(</span><span class="kt">Deque</span> <span class="n">a</span><span class="p">)</span><span class="sc">'</span>
<span class="kt">Data</span><span class="nf">\</span><span class="kt">Queue</span><span class="o">.</span><span class="n">hs</span><span class="kt">:</span><span class="mi">36</span><span class="kt">:</span><span class="mi">17</span><span class="kt">:</span>
<span class="kt">The</span> <span class="n">first</span> <span class="n">argument</span> <span class="kr">of</span> <span class="p">`</span><span class="kt">Queue'</span> <span class="n">should</span> <span class="n">have</span> <span class="n">kind</span> <span class="p">`</span><span class="o">*</span> <span class="ow">-></span> <span class="o">*</span><span class="sc">'</span><span class="err">,</span>
<span class="n">but</span> <span class="p">`</span><span class="kt">PriorityQueue</span> <span class="n">a'</span> <span class="n">has</span> <span class="n">kind</span> <span class="p">`</span><span class="o">*</span><span class="sc">'</span>
<span class="kt">In</span> <span class="n">the</span> <span class="kr">instance</span> <span class="n">declaration</span> <span class="n">for</span> <span class="p">`</span><span class="kt">Queue</span> <span class="p">(</span><span class="kt">PriorityQueue</span> <span class="n">a</span><span class="p">)</span><span class="sc">'</span>
</pre></div>
</td></tr></table>
<p>Quelle syntaxe devrai-je écrire ?</p>
<p>Merci d'avance,</p>
<p>AZ.</p>
<p>PS: ça n'a rien à voir, mais je viens de terminer un 2048 en mode console, j'aimerais le porter en mode graphique. Vous me conseillez quelle librairie graphique ?</p>