<odd>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/152/" class="object" subclass="blog" published="Sun, 16 May 2010 05:34:15 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="owner_uuid" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="container_uuid" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="title" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[L-System 2]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="description" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[<p>Hice unos avances en este <a href="http://devel.comunidadhaskell.org/l-system" target="_blank" title="proyecto l-system">proyecto</a>, implemente la parte de movimiento turtle.</p>
<p>Turtle, es un lenguaje para generar recorridos. Basicamente turtle tiene un estado y comandos a ejecutar sobre el estado.</p>
<p>El estado es la posicion (x,y) del objeto, la distacia a recorrer y un angulo que guia la direccion.</p>
<p>Los comando son:<br />F &nbsp;-&gt; avanzar adelante y dibujar una linea entre el punto del estado y el nuevo generado por la distancia y angulo.<br />f &nbsp;-&gt; avanzar adelante pero sin dibujar ninguna linea.<br />+ -&gt; incrementar el angulo de estado con otro angulo constante.<br />- -&gt; decrementar el angulo del estado con otro angulo constante.</p>
<p>Entonces, la anterior version generaba el resultado de un sistema L, ahora en esta nueva version, genero elementos del lenguaje turtle. Y una ves generados estos elementos, los interpreto con una libreria grafica, wxhaskell.</p>
<p>Les dejo algunas imagenes de los resultados obtenidos:</p>
<p><img src="/action/file/download?file_guid=149" border="0" alt="lsystem-koch" width="839" height="762" /></p>
<p>&nbsp;</p>
<p><img src="/action/file/download?file_guid=150" border="0" alt="kochil" /><img src="/action/file/download?file_guid=151" border="0" alt="koche" width="287" height="285" /></p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/152/lsystem-2">L-System 2</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				May 16, 2010				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/152/lsystem-2">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/L-System">L-System</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Hice unos avances en este <a href="http://devel.comunidadhaskell.org/l-system" target="_blank" title="proyecto l-system">proyecto</a>, implemente la parte de movimiento turtle.</p>
<p>Turtle, es un lenguaje para generar recorridos. Basicamente turtle tiene un estado y comandos a ejecutar sobre el estado.</p>
<p>El estado es la posicion (x,y) del objeto, la distacia a recorrer y un angulo que guia la direccion.</p>
<p>Los comando son:<br />F &nbsp;-&gt; avanzar adelante y dibujar una linea entre el punto del estado y el nuevo generado por la distancia y angulo.<br />f &nbsp;-&gt; avanzar adelante pero sin dibujar ninguna linea.<br />+ -&gt; incrementar el angulo de estado con otro angulo constante.<br />- -&gt; decrementar el angulo del estado con otro angulo constante.</p>
<p>Entonces, la anterior version generaba el resultado de un sistema L, ahora en esta nueva version, genero elementos del lenguaje turtle. Y una ves generados estos elementos, los interpreto con una libreria grafica, wxhaskell.</p>
<p>Les dejo algunas imagenes de los resultados obtenidos:</p>
<p><img src="/action/file/download?file_guid=149" border="0" alt="lsystem-koch" width="839" height="762" /></p>
<p>&nbsp;</p>
<p><img src="/action/file/download?file_guid=150" border="0" alt="kochil" /><img src="/action/file/download?file_guid=151" border="0" alt="koche" width="287" height="285" /></p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/metadata/1318/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 16 May 2010 06:04:09 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/metadata/1317/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 16 May 2010 06:04:09 +0200" ><![CDATA[L-System]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/metadata/1303/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/152/" class="object" subclass="blog" published="Sun, 16 May 2010 05:34:15 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="owner_uuid" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="container_uuid" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="title" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[L-System 2]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="description" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[<p>Hice unos avances en este <a href="http://devel.comunidadhaskell.org/l-system" target="_blank" title="proyecto l-system">proyecto</a>, implemente la parte de movimiento turtle.</p>
<p>Turtle, es un lenguaje para generar recorridos. Basicamente turtle tiene un estado y comandos a ejecutar sobre el estado.</p>
<p>El estado es la posicion (x,y) del objeto, la distacia a recorrer y un angulo que guia la direccion.</p>
<p>Los comando son:<br />F &nbsp;-&gt; avanzar adelante y dibujar una linea entre el punto del estado y el nuevo generado por la distancia y angulo.<br />f &nbsp;-&gt; avanzar adelante pero sin dibujar ninguna linea.<br />+ -&gt; incrementar el angulo de estado con otro angulo constante.<br />- -&gt; decrementar el angulo del estado con otro angulo constante.</p>
<p>Entonces, la anterior version generaba el resultado de un sistema L, ahora en esta nueva version, genero elementos del lenguaje turtle. Y una ves generados estos elementos, los interpreto con una libreria grafica, wxhaskell.</p>
<p>Les dejo algunas imagenes de los resultados obtenidos:</p>
<p><img src="/action/file/download?file_guid=149" border="0" alt="lsystem-koch" width="839" height="762" /></p>
<p>&nbsp;</p>
<p><img src="/action/file/download?file_guid=150" border="0" alt="kochil" /><img src="/action/file/download?file_guid=151" border="0" alt="koche" width="287" height="285" /></p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/152/lsystem-2">L-System 2</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				May 16, 2010				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/152/lsystem-2">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/L-System">L-System</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Hice unos avances en este <a href="http://devel.comunidadhaskell.org/l-system" target="_blank" title="proyecto l-system">proyecto</a>, implemente la parte de movimiento turtle.</p>
<p>Turtle, es un lenguaje para generar recorridos. Basicamente turtle tiene un estado y comandos a ejecutar sobre el estado.</p>
<p>El estado es la posicion (x,y) del objeto, la distacia a recorrer y un angulo que guia la direccion.</p>
<p>Los comando son:<br />F &nbsp;-&gt; avanzar adelante y dibujar una linea entre el punto del estado y el nuevo generado por la distancia y angulo.<br />f &nbsp;-&gt; avanzar adelante pero sin dibujar ninguna linea.<br />+ -&gt; incrementar el angulo de estado con otro angulo constante.<br />- -&gt; decrementar el angulo del estado con otro angulo constante.</p>
<p>Entonces, la anterior version generaba el resultado de un sistema L, ahora en esta nueva version, genero elementos del lenguaje turtle. Y una ves generados estos elementos, los interpreto con una libreria grafica, wxhaskell.</p>
<p>Les dejo algunas imagenes de los resultados obtenidos:</p>
<p><img src="/action/file/download?file_guid=149" border="0" alt="lsystem-koch" width="839" height="762" /></p>
<p>&nbsp;</p>
<p><img src="/action/file/download?file_guid=150" border="0" alt="kochil" /><img src="/action/file/download?file_guid=151" border="0" alt="koche" width="287" height="285" /></p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/metadata/1318/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 16 May 2010 06:04:09 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/metadata/1317/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 16 May 2010 06:04:09 +0200" ><![CDATA[L-System]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/152/metadata/1303/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/152/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 16 May 2010 05:34:15 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/148/" class="object" subclass="blog" published="Sat, 15 May 2010 09:57:20 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="owner_uuid" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="container_uuid" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="title" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[L-System]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="description" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[<div>
<h1>L-System</h1>
<p>Hoy por la noche, cuando navegaba por la red me encontre con algo interesante. Y decidi iniciar un proyecto peque&ntilde;o, un <a href="http://devel.comunidadhaskell.org/l-system">L-System</a> en Haskell.</p>
<p>Este proyecto me trae recuerdos cuando estaba en la materia de Interfaces de Usuario con el Lic. Boris Calancha, en la que desarrollamos fractales con Java, de una forma recursiva. En aquel entonces no tenia la menor idea de que existia una generalizacion en la forma de generar fractales, pues hoy aprendi que si hay una generalizacion muy interesante, me intereso mas que todo por que esta relacionado con el campo de estudio que sigo, gramaticas, compiladores y haskell.</p>
<p>Pues resulta que un L-System es una tri-tupla, (muy parecido a las gramaticas que estudiamos en automatas)</p>
<p>G (V, w, P)</p>
<p>donde:</p>
<p>V: Alfabeto o conjunto de Simbolos <br />w: Simbolo Inicial <br />P: Reglas de Produccion o de re-writing</p>
<p>Asi, esta tri-tupla es capaz de generar fractales. La forma de hacerlo es atraves de derivaciones empezando con el simbolo inicial (no olviden que para hacer una derivacion usamos las reglas de produccion). Entonces de acuerdo al fractal que queramos, podemos aplicar (derivar) varias veces.</p>
<p>Veamos un ejemplo de <a href="http://en.wikipedia.org/wiki/L-system">wikipedia</a>,</p>
<p>Example 1: Algae<br /><span style="font-family: monospace; line-height: 18px; font-size: 12px; white-space: pre;">variables : A B                 =&gt; alfabeto</span></p>
<pre><code>constants : none
start  : A                      =&gt; simbolo inicial
rules  : (A &rarr; AB), (B &rarr; A)      =&gt; 2 reglas de produccion
which produces:
n = 0 : A
n = 1 : AB
n = 2 : ABA
n = 3 : ABAAB
n = 4 : ABAABABA
n = 5 : ABAABABAABAAB
n = 6 : ABAABABAABAABABAABABA
n = 7 : ABAABABAABAABABAABABAABAABABAABAAB
</code></pre>
<p>Cuando vemos este ejemplo, no parece animar ni convencer para seguir con el proyecto, sin embargo, si vale la pena seguir cuando se ve las imagenes que se puede generar (fractales), y eso se logra con la ayuda de una libreria grafica y un sistema denominado turtle para interpretacion de strings. Si quieres convencerte al igual que yo, debes ver las imagenes de <a href="http://en.wikipedia.org/wiki/L-system">wikipedia</a>.</p>
<p>Bueno, y esta oportunidad queria compartirles la implementacion de una parte basica de este sistema L,</p>
<p>la forma en que represento un sistema L es asi:</p>
<pre><code>type L = (V, W, P)              -- Sistema L

type V = [String]
type W = String
type P = [(Char, String)]       -- simbolo -&gt; resultado == (simbolo, resultado)
</code></pre>
<p>genero un parser de acuerdo a las producciones:</p>
<pre><code>--genParser :: [(Char, String)] -&gt; Parser ? ?
genParser lst = if null lst 
                then usererror "GenParser: the argument my not be empty list."
                else foldr1 (&lt;|&gt;) (map fun lst)
    where fun (val, res) = (res &lt;$ pSym val)
</code></pre>
<p>y genero las iteraciones enviandole el sistema L y un N que indica el numero de iteraciones, esta funcion imprime el resultado en la pantalla.</p>
<pre><code>generate :: L -&gt; Int -&gt; IO ()
</code></pre>
<p>Veamos algunos ejemplos de sistemas L:</p>
<pre><code>{- 
Example 1: Algae

variables : A B
constants : none
start  : A
rules  : (A &rarr; AB), (B &rarr; A)
-}

algae = (["A", "B"], "A", [('A', "AB"),('B',"A")])

{-
Example 2: Fibonacci numbers

variables : A B
constants : none
start  : A
rules  : (A &rarr; B), (B &rarr; AB)
-}

fib = (["A","B"], "A", [('A', "B"),('B',"AB")])

{-
Example 3: Cantor dust

variables : A B
constants : none
start  : A
rules  : (A &rarr; ABA), (B &rarr; BBB)
-}

cantor1 = (["A","B"], "A", [('A', "ABA"),('B',"BBB")])
cantor2 = (["-"," "], "-", [('-', "- -"),(' ',"   ")])
</code></pre>
<p>Ahora mostremos algunos ejemplos:</p>
<p>*Parser&gt; generate fib 7 <br />BABABBABABBABBABABBAB</p>
<p>*Parser&gt;&nbsp;generate algae 7 <br />ABAABABAABAABABAABABAABAABABAABAAB</p>
<p>*Parser&gt; generate cantor1 4 ABABBBABABBBBBBBBBABABBBABABBBBBBBBBBBBBBBBBBBBBBBBBBBABABBBABABBBBBBBBBABABBBABA</p>
<p>*Parser&gt; generate cantor2 4 <br />- - - - - - - - - - - - - - - -<br />(Nota.- este utlimo no se grafico bien, pero se genera correctamente en consola)</p>
<p>Bueno eso es todo por hoy, si quieres ver el codigo y el proyecto, te invito que sigas este <a href="http://devel.comunidadhaskell.org/l-system">link</a>.</p>
</div>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/148/lsystem">L-System</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				May 15, 2010				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/148/lsystem">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/L-System">L-System</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<div>
<h1>L-System</h1>
<p>Hoy por la noche, cuando navegaba por la red me encontre con algo interesante. Y decidi iniciar un proyecto peque&ntilde;o, un <a href="http://devel.comunidadhaskell.org/l-system">L-System</a> en Haskell.</p>
<p>Este proyecto me trae recuerdos cuando estaba en la materia de Interfaces de Usuario con el Lic. Boris Calancha, en la que desarrollamos fractales con Java, de una forma recursiva. En aquel entonces no tenia la menor idea de que existia una generalizacion en la forma de generar fractales, pues hoy aprendi que si hay una generalizacion muy interesante, me intereso mas que todo por que esta relacionado con el campo de estudio que sigo, gramaticas, compiladores y haskell.</p>
<p>Pues resulta que un L-System es una tri-tupla, (muy parecido a las gramaticas que estudiamos en automatas)</p>
<p>G (V, w, P)</p>
<p>donde:</p>
<p>V: Alfabeto o conjunto de Simbolos <br />w: Simbolo Inicial <br />P: Reglas de Produccion o de re-writing</p>
<p>Asi, esta tri-tupla es capaz de generar fractales. La forma de hacerlo es atraves de derivaciones empezando con el simbolo inicial (no olviden que para hacer una derivacion usamos las reglas de produccion). Entonces de acuerdo al fractal que queramos, podemos aplicar (derivar) varias veces.</p>
<p>Veamos un ejemplo de <a href="http://en.wikipedia.org/wiki/L-system">wikipedia</a>,</p>
<p>Example 1: Algae<br /><span style="font-family: monospace; line-height: 18px; font-size: 12px; white-space: pre;">variables : A B                 =&gt; alfabeto</span></p>
<pre><code>constants : none<br />
start  : A                      =&gt; simbolo inicial<br />
rules  : (A &rarr; AB), (B &rarr; A)      =&gt; 2 reglas de produccion<br />
which produces:<br />
n = 0 : A<br />
n = 1 : AB<br />
n = 2 : ABA<br />
n = 3 : ABAAB<br />
n = 4 : ABAABABA<br />
n = 5 : ABAABABAABAAB<br />
n = 6 : ABAABABAABAABABAABABA<br />
n = 7 : ABAABABAABAABABAABABAABAABABAABAAB<br />
</code></pre>
<p>Cuando vemos este ejemplo, no parece animar ni convencer para seguir con el proyecto, sin embargo, si vale la pena seguir cuando se ve las imagenes que se puede generar (fractales), y eso se logra con la ayuda de una libreria grafica y un sistema denominado turtle para interpretacion de strings. Si quieres convencerte al igual que yo, debes ver las imagenes de <a href="http://en.wikipedia.org/wiki/L-system">wikipedia</a>.</p>
<p>Bueno, y esta oportunidad queria compartirles la implementacion de una parte basica de este sistema L,</p>
<p>la forma en que represento un sistema L es asi:</p>
<pre><code>type L = (V, W, P)              -- Sistema L</p>
<p>type V = [String]<br />
type W = String<br />
type P = [(Char, String)]       -- simbolo -&gt; resultado == (simbolo, resultado)<br />
</code></pre>
<p>genero un parser de acuerdo a las producciones:</p>
<pre><code>--genParser :: [(Char, String)] -&gt; Parser ? ?<br />
genParser lst = if null lst<br />
                then usererror "GenParser: the argument my not be empty list."<br />
                else foldr1 (&lt;|&gt;) (map fun lst)<br />
    where fun (val, res) = (res &lt;$ pSym val)<br />
</code></pre>
<p>y genero las iteraciones enviandole el sistema L y un N que indica el numero de iteraciones, esta funcion imprime el resultado en la pantalla.</p>
<pre><code>generate :: L -&gt; Int -&gt; IO ()<br />
</code></pre>
<p>Veamos algunos ejemplos de sistemas L:</p>
<pre><code>{-<br />
Example 1: Algae</p>
<p>variables : A B<br />
constants : none<br />
start  : A<br />
rules  : (A &rarr; AB), (B &rarr; A)<br />
-}</p>
<p>algae = (["A", "B"], "A", [('A', "AB"),('B',"A")])</p>
<p>{-<br />
Example 2: Fibonacci numbers</p>
<p>variables : A B<br />
constants : none<br />
start  : A<br />
rules  : (A &rarr; B), (B &rarr; AB)<br />
-}</p>
<p>fib = (["A","B"], "A", [('A', "B"),('B',"AB")])</p>
<p>{-<br />
Example 3: Cantor dust</p>
<p>variables : A B<br />
constants : none<br />
start  : A<br />
rules  : (A &rarr; ABA), (B &rarr; BBB)<br />
-}</p>
<p>cantor1 = (["A","B"], "A", [('A', "ABA"),('B',"BBB")])<br />
cantor2 = (["-"," "], "-", [('-', "- -"),(' ',"   ")])<br />
</code></pre>
<p>Ahora mostremos algunos ejemplos:</p>
<p>*Parser&gt; generate fib 7 <br />BABABBABABBABBABABBAB</p>
<p>*Parser&gt;&nbsp;generate algae 7 <br />ABAABABAABAABABAABABAABAABABAABAAB</p>
<p>*Parser&gt; generate cantor1 4 ABABBBABABBBBBBBBBABABBBABABBBBBBBBBBBBBBBBBBBBBBBBBBBABABBBABABBBBBBBBBABABBBABA</p>
<p>*Parser&gt; generate cantor2 4 <br />- - - - - - - - - - - - - - - -<br />(Nota.- este utlimo no se grafico bien, pero se genera correctamente en consola)</p>
<p>Bueno eso es todo por hoy, si quieres ver el codigo y el proyecto, te invito que sigas este <a href="http://devel.comunidadhaskell.org/l-system">link</a>.</p>
</div>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/metadata/1267/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sat, 15 May 2010 10:04:23 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/metadata/1266/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sat, 15 May 2010 10:04:23 +0200" ><![CDATA[L-System]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/metadata/1262/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/148/" class="object" subclass="blog" published="Sat, 15 May 2010 09:57:20 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="owner_uuid" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="container_uuid" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="title" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[L-System]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="description" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[<div>
<h1>L-System</h1>
<p>Hoy por la noche, cuando navegaba por la red me encontre con algo interesante. Y decidi iniciar un proyecto peque&ntilde;o, un <a href="http://devel.comunidadhaskell.org/l-system">L-System</a> en Haskell.</p>
<p>Este proyecto me trae recuerdos cuando estaba en la materia de Interfaces de Usuario con el Lic. Boris Calancha, en la que desarrollamos fractales con Java, de una forma recursiva. En aquel entonces no tenia la menor idea de que existia una generalizacion en la forma de generar fractales, pues hoy aprendi que si hay una generalizacion muy interesante, me intereso mas que todo por que esta relacionado con el campo de estudio que sigo, gramaticas, compiladores y haskell.</p>
<p>Pues resulta que un L-System es una tri-tupla, (muy parecido a las gramaticas que estudiamos en automatas)</p>
<p>G (V, w, P)</p>
<p>donde:</p>
<p>V: Alfabeto o conjunto de Simbolos <br />w: Simbolo Inicial <br />P: Reglas de Produccion o de re-writing</p>
<p>Asi, esta tri-tupla es capaz de generar fractales. La forma de hacerlo es atraves de derivaciones empezando con el simbolo inicial (no olviden que para hacer una derivacion usamos las reglas de produccion). Entonces de acuerdo al fractal que queramos, podemos aplicar (derivar) varias veces.</p>
<p>Veamos un ejemplo de <a href="http://en.wikipedia.org/wiki/L-system">wikipedia</a>,</p>
<p>Example 1: Algae<br /><span style="font-family: monospace; line-height: 18px; font-size: 12px; white-space: pre;">variables : A B                 =&gt; alfabeto</span></p>
<pre><code>constants : none
start  : A                      =&gt; simbolo inicial
rules  : (A &rarr; AB), (B &rarr; A)      =&gt; 2 reglas de produccion
which produces:
n = 0 : A
n = 1 : AB
n = 2 : ABA
n = 3 : ABAAB
n = 4 : ABAABABA
n = 5 : ABAABABAABAAB
n = 6 : ABAABABAABAABABAABABA
n = 7 : ABAABABAABAABABAABABAABAABABAABAAB
</code></pre>
<p>Cuando vemos este ejemplo, no parece animar ni convencer para seguir con el proyecto, sin embargo, si vale la pena seguir cuando se ve las imagenes que se puede generar (fractales), y eso se logra con la ayuda de una libreria grafica y un sistema denominado turtle para interpretacion de strings. Si quieres convencerte al igual que yo, debes ver las imagenes de <a href="http://en.wikipedia.org/wiki/L-system">wikipedia</a>.</p>
<p>Bueno, y esta oportunidad queria compartirles la implementacion de una parte basica de este sistema L,</p>
<p>la forma en que represento un sistema L es asi:</p>
<pre><code>type L = (V, W, P)              -- Sistema L

type V = [String]
type W = String
type P = [(Char, String)]       -- simbolo -&gt; resultado == (simbolo, resultado)
</code></pre>
<p>genero un parser de acuerdo a las producciones:</p>
<pre><code>--genParser :: [(Char, String)] -&gt; Parser ? ?
genParser lst = if null lst 
                then usererror "GenParser: the argument my not be empty list."
                else foldr1 (&lt;|&gt;) (map fun lst)
    where fun (val, res) = (res &lt;$ pSym val)
</code></pre>
<p>y genero las iteraciones enviandole el sistema L y un N que indica el numero de iteraciones, esta funcion imprime el resultado en la pantalla.</p>
<pre><code>generate :: L -&gt; Int -&gt; IO ()
</code></pre>
<p>Veamos algunos ejemplos de sistemas L:</p>
<pre><code>{- 
Example 1: Algae

variables : A B
constants : none
start  : A
rules  : (A &rarr; AB), (B &rarr; A)
-}

algae = (["A", "B"], "A", [('A', "AB"),('B',"A")])

{-
Example 2: Fibonacci numbers

variables : A B
constants : none
start  : A
rules  : (A &rarr; B), (B &rarr; AB)
-}

fib = (["A","B"], "A", [('A', "B"),('B',"AB")])

{-
Example 3: Cantor dust

variables : A B
constants : none
start  : A
rules  : (A &rarr; ABA), (B &rarr; BBB)
-}

cantor1 = (["A","B"], "A", [('A', "ABA"),('B',"BBB")])
cantor2 = (["-"," "], "-", [('-', "- -"),(' ',"   ")])
</code></pre>
<p>Ahora mostremos algunos ejemplos:</p>
<p>*Parser&gt; generate fib 7 <br />BABABBABABBABBABABBAB</p>
<p>*Parser&gt;&nbsp;generate algae 7 <br />ABAABABAABAABABAABABAABAABABAABAAB</p>
<p>*Parser&gt; generate cantor1 4 ABABBBABABBBBBBBBBABABBBABABBBBBBBBBBBBBBBBBBBBBBBBBBBABABBBABABBBBBBBBBABABBBABA</p>
<p>*Parser&gt; generate cantor2 4 <br />- - - - - - - - - - - - - - - -<br />(Nota.- este utlimo no se grafico bien, pero se genera correctamente en consola)</p>
<p>Bueno eso es todo por hoy, si quieres ver el codigo y el proyecto, te invito que sigas este <a href="http://devel.comunidadhaskell.org/l-system">link</a>.</p>
</div>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/148/lsystem">L-System</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				May 15, 2010				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/148/lsystem">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/L-System">L-System</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<div>
<h1>L-System</h1>
<p>Hoy por la noche, cuando navegaba por la red me encontre con algo interesante. Y decidi iniciar un proyecto peque&ntilde;o, un <a href="http://devel.comunidadhaskell.org/l-system">L-System</a> en Haskell.</p>
<p>Este proyecto me trae recuerdos cuando estaba en la materia de Interfaces de Usuario con el Lic. Boris Calancha, en la que desarrollamos fractales con Java, de una forma recursiva. En aquel entonces no tenia la menor idea de que existia una generalizacion en la forma de generar fractales, pues hoy aprendi que si hay una generalizacion muy interesante, me intereso mas que todo por que esta relacionado con el campo de estudio que sigo, gramaticas, compiladores y haskell.</p>
<p>Pues resulta que un L-System es una tri-tupla, (muy parecido a las gramaticas que estudiamos en automatas)</p>
<p>G (V, w, P)</p>
<p>donde:</p>
<p>V: Alfabeto o conjunto de Simbolos <br />w: Simbolo Inicial <br />P: Reglas de Produccion o de re-writing</p>
<p>Asi, esta tri-tupla es capaz de generar fractales. La forma de hacerlo es atraves de derivaciones empezando con el simbolo inicial (no olviden que para hacer una derivacion usamos las reglas de produccion). Entonces de acuerdo al fractal que queramos, podemos aplicar (derivar) varias veces.</p>
<p>Veamos un ejemplo de <a href="http://en.wikipedia.org/wiki/L-system">wikipedia</a>,</p>
<p>Example 1: Algae<br /><span style="font-family: monospace; line-height: 18px; font-size: 12px; white-space: pre;">variables : A B                 =&gt; alfabeto</span></p>
<pre><code>constants : none<br />
start  : A                      =&gt; simbolo inicial<br />
rules  : (A &rarr; AB), (B &rarr; A)      =&gt; 2 reglas de produccion<br />
which produces:<br />
n = 0 : A<br />
n = 1 : AB<br />
n = 2 : ABA<br />
n = 3 : ABAAB<br />
n = 4 : ABAABABA<br />
n = 5 : ABAABABAABAAB<br />
n = 6 : ABAABABAABAABABAABABA<br />
n = 7 : ABAABABAABAABABAABABAABAABABAABAAB<br />
</code></pre>
<p>Cuando vemos este ejemplo, no parece animar ni convencer para seguir con el proyecto, sin embargo, si vale la pena seguir cuando se ve las imagenes que se puede generar (fractales), y eso se logra con la ayuda de una libreria grafica y un sistema denominado turtle para interpretacion de strings. Si quieres convencerte al igual que yo, debes ver las imagenes de <a href="http://en.wikipedia.org/wiki/L-system">wikipedia</a>.</p>
<p>Bueno, y esta oportunidad queria compartirles la implementacion de una parte basica de este sistema L,</p>
<p>la forma en que represento un sistema L es asi:</p>
<pre><code>type L = (V, W, P)              -- Sistema L</p>
<p>type V = [String]<br />
type W = String<br />
type P = [(Char, String)]       -- simbolo -&gt; resultado == (simbolo, resultado)<br />
</code></pre>
<p>genero un parser de acuerdo a las producciones:</p>
<pre><code>--genParser :: [(Char, String)] -&gt; Parser ? ?<br />
genParser lst = if null lst<br />
                then usererror "GenParser: the argument my not be empty list."<br />
                else foldr1 (&lt;|&gt;) (map fun lst)<br />
    where fun (val, res) = (res &lt;$ pSym val)<br />
</code></pre>
<p>y genero las iteraciones enviandole el sistema L y un N que indica el numero de iteraciones, esta funcion imprime el resultado en la pantalla.</p>
<pre><code>generate :: L -&gt; Int -&gt; IO ()<br />
</code></pre>
<p>Veamos algunos ejemplos de sistemas L:</p>
<pre><code>{-<br />
Example 1: Algae</p>
<p>variables : A B<br />
constants : none<br />
start  : A<br />
rules  : (A &rarr; AB), (B &rarr; A)<br />
-}</p>
<p>algae = (["A", "B"], "A", [('A', "AB"),('B',"A")])</p>
<p>{-<br />
Example 2: Fibonacci numbers</p>
<p>variables : A B<br />
constants : none<br />
start  : A<br />
rules  : (A &rarr; B), (B &rarr; AB)<br />
-}</p>
<p>fib = (["A","B"], "A", [('A', "B"),('B',"AB")])</p>
<p>{-<br />
Example 3: Cantor dust</p>
<p>variables : A B<br />
constants : none<br />
start  : A<br />
rules  : (A &rarr; ABA), (B &rarr; BBB)<br />
-}</p>
<p>cantor1 = (["A","B"], "A", [('A', "ABA"),('B',"BBB")])<br />
cantor2 = (["-"," "], "-", [('-', "- -"),(' ',"   ")])<br />
</code></pre>
<p>Ahora mostremos algunos ejemplos:</p>
<p>*Parser&gt; generate fib 7 <br />BABABBABABBABBABABBAB</p>
<p>*Parser&gt;&nbsp;generate algae 7 <br />ABAABABAABAABABAABABAABAABABAABAAB</p>
<p>*Parser&gt; generate cantor1 4 ABABBBABABBBBBBBBBABABBBABABBBBBBBBBBBBBBBBBBBBBBBBBBBABABBBABABBBBBBBBBABABBBABA</p>
<p>*Parser&gt; generate cantor2 4 <br />- - - - - - - - - - - - - - - -<br />(Nota.- este utlimo no se grafico bien, pero se genera correctamente en consola)</p>
<p>Bueno eso es todo por hoy, si quieres ver el codigo y el proyecto, te invito que sigas este <a href="http://devel.comunidadhaskell.org/l-system">link</a>.</p>
</div>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/metadata/1267/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sat, 15 May 2010 10:04:23 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/metadata/1266/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sat, 15 May 2010 10:04:23 +0200" ><![CDATA[L-System]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/148/metadata/1262/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/148/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sat, 15 May 2010 09:57:20 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/124/" class="object" subclass="blog" published="Wed, 24 Mar 2010 07:29:11 +0100" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="owner_uuid" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="container_uuid" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="title" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[Phantom Types con uuagc]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="description" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[<p>Despues de entender <a href="http://ajayu.memi.umss.edu.bo/tati/weblog/dsls-haskell-gadts-phantom-types" target="_blank" title="Phanton Types">Phantom Types</a>, me puse a ver la manera de hacerlo con AGs (Attribute Grammar), y la verdad no es cosa de otro mundo. Pero veamoslo paso a paso.</p>
<p>Un Phantom Type, es una tecnica que nos permite hacer chequeo de tipos en tiempo de compilacion manteniendo una gramatica abstracta sencilla y comprensible.</p>
<p>Veamoslo con el ejemplo de la pagina fuente, tenemos un evaluador de expresiones, el cual es reescrito usando gramatica de attributos de esta manera:</p>
<blockquote>
<p>DATA Expr<br />&nbsp;&nbsp; &nbsp;| Val Int<br />&nbsp;&nbsp; &nbsp;| Add le,lr : Expr<br />&nbsp;&nbsp; &nbsp;| LE e1, e2 : Expr<br />&nbsp;&nbsp; &nbsp;| Cond ex, iex, eex : Expr</p>
<p>DERIVING * : Show</p>
<p>ATTR Expr [ | | value : {Res}]</p>
<p>SEM Expr<br />&nbsp;&nbsp; &nbsp;| Val lhs.value &nbsp;= ResI @int<br />&nbsp;&nbsp; &nbsp;| Add lhs.value &nbsp;= case (@le.value, @lr.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ResI x, ResI y) -&gt; ResI (x + y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Add"<br />&nbsp;&nbsp; &nbsp;| LE lhs.value &nbsp; = case (@e1.value, @e2.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ResI x, ResI y) &nbsp;-&gt; ResB (x &lt;= y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; error "Bad Arguments to LE"<br />&nbsp;&nbsp; &nbsp;| Cond lhs.value = case (@ex.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ResB b -&gt; if b then @iex.value else @eex.value<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Cond"</p>
<p>{<br />data Res = ResI Int&nbsp;| ResB Bool &nbsp;deriving Show</p>
<p>main :: IO()<br />main = print e1<br />&nbsp;&nbsp; &nbsp;where e1 = sem_Expr (Cond (LE (Val 3) (Val 5)) (Add (Val 1) (Val 2)) (Val 0))  t;br /&gt;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e2 = sem_Expr (Cond (Val 1) (Val 1) (Val 1))<br />}</p>
</blockquote>
<p>Para probarlo, hacemos "<em>uuagc -mdfcs AExpr.ag</em>", y luego lo cargamos con "<em>ghci AExpr.hs</em>" y lo ejecutamos con "<em>main</em>", y el resultado sera "<em>ResI 3</em>".</p>
<p>Hasta aqui, todo anda bien, pero que pasa si en el ag cambiamos "<em>e1</em>", por "<em>e2</em>" en el "<em>main</em>"?despues ejecutarlo nos da un error de "<em>Bad arguments to Cond</em>", asi como lo esperabamos. Pero que pasaria si <strong>no</strong> queremos obtener estos errores, y que si quisieramos capturar estos errores en tiempo de compilacion?, una forma comun de hacerlo seria cambiando nuestro tipo algebraico y escribiendo una gramatica abstracta que tenga expresiones booleanas, enteras y demas cosas. Pero una forma es usando la tecnica de Phantom Type, como lo mensionamos mas antes, mantenemos una gramatica sencilla y nos permite usar el chequeo de tipos de Haskell.</p>
<p>Entonces, lo reescribimos de esta manera:</p>
<blockquote>
<p>DATA Expr'<br />&nbsp;&nbsp; &nbsp;| Val Int<br />&nbsp;&nbsp; &nbsp;| Add le,lr : Expr'<br />&nbsp;&nbsp; &nbsp;| LE e1, e2 : Expr'<br />&nbsp;&nbsp; &nbsp;| Cond ex, iex, eex : Expr'</p>
<p>DERIVING * : Show</p>
<p>ATTR Expr' [ | | value : {Res}]<br />SEM Expr'<br />&nbsp;&nbsp; &nbsp;| Val lhs.value &nbsp;= ResI @int<br />&nbsp;&nbsp; &nbsp;| Add lhs.value &nbsp;= case (@le.value, @lr.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ResI x, ResI y) -&gt; ResI (x + y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Add"<br />&nbsp;&nbsp; &nbsp;| LE lhs.value &nbsp; = case (@e1.value, @e2.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ResI x, ResI y) &nbsp;-&gt; ResB (x &lt;= y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; error "Bad Arguments to LE"<br />&nbsp;&nbsp; &nbsp;| Cond lhs.value = case (@ex.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ResB b -&gt; if b then @iex.value else @eex.value<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Cond"</p>
<p>{<br />data Res = ResI Int&nbsp;| ResB Bool&nbsp;&nbsp;deriving Show</p>
<p>newtype Expr a = E Expr'<br />&nbsp;&nbsp; &nbsp;deriving (Show)</p>
<p>-- wrappers<br />val :: Int -&gt; Expr Int<br />val = E . Val</p>
<p>add :: Expr Int -&gt; Expr Int -&gt; Expr Int<br />add (E x) (E y) = E $ Add x y</p>
<p>le :: Expr Int -&gt; Expr Int -&gt; Expr Bool<br />le (E x) (E y) = E $ LE x y</p>
<p>cond :: Expr Bool -&gt; Expr a -&gt; Expr a -&gt; Expr a<br />cond (E c) (E x) (E y) = E $ Cond c x y</p>
<p>eval :: Expr a -&gt; Res<br />eval (E e) = sem_Expr' e</p>
<p>main :: IO()<br />main = print e1<br />&nbsp;&nbsp; &nbsp;where e1 = eval (cond (le (val 3) (val 5)) (add (val 1) (val 2)) (val 0))<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --e2 = eval (cond (val 1) (val 1) (val 1))<br />}</p>
</blockquote>
<p>Y ahora, ejecutamos lo mismo que la ultima ves y obtenemos el mismo resultado. Pero si cambiamos "<em>e1</em>" por "<em>e2</em>" en el "<em>main</em>", descomentamos "<em>e2</em>" e intentamos compilarlo, obtendremos un error de tipos en tiempo de compilacion, asi podremos contruir solo expresiones validas para nuestro evaluador.</p>
<p>Donde esta la tecnica de Phantom Type?, los hacemos atraves de "<em>newtype Expr a = E Expr'</em>&nbsp;", el cual crea un nuevo tipo parametrizando el tipo deseado, el cual es controlado por el type chequer de Haskell. Este nuevo tipo, tiene en su contructor de datos algo asi como un tipo fantasma (Phantom Type), esto pienso asi porque:</p>
<blockquote>
<p>-- el tipo del contructor de datos de Expr seria<br />E :: Expr' -&gt; Expr a<br /><br />-- por ejemplo el tipo de val, es<br />val :: Int -&gt; Expr Int</p>
</blockquote>
<p>Asi el tipo de "<em>Expr a</em>" no refleja el contenido que tiene empaquetado, por eso pienso que el tipo de adentro es el fantasma.</p>
<p>Volviendo al tema, el siguiente paso despues de crear el tipo fantasma, es escribir las funciones wrapper, los cuales se encargan de contruir el "<em>Expr</em>' " que queremos. Y tambien es aqui donde detallamos el chequeo de tipos para Haskell.</p>
<p>En el AG podemos borrar los casos erroneos de los expresiones case, sin afectar los resultados. Y para una mejor presentacion y cuidado, podemos exportar junto con el modulo, solo las funciones wrappers y tipos necesarios.</p>
<p>Bueno, esta es la manera en que implemente Phantom Types con AGs. Si ves el documento fuente, te preguntaras como implemetar GADTs con AGs, pues es algo que yo aun sigo preguntandome, y la verdad no se si habra una manera de hacerlo con AGs, pero como al autor de decia, Phantom Types es una solucion elegante, relativamente sencilla y estandard de Haskell en comparacion con GADTs.</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/124/phantom-types-con-uuagc">Phantom Types con uuagc</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				March 24, 2010				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/124/phantom-types-con-uuagc">Comentarios (3)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/phantom+types">phantom types</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/tipos+fantasmas">tipos fantasmas</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/uuagc">uuagc</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Despues de entender <a href="http://ajayu.memi.umss.edu.bo/tati/weblog/dsls-haskell-gadts-phantom-types" target="_blank" title="Phanton Types">Phantom Types</a>, me puse a ver la manera de hacerlo con AGs (Attribute Grammar), y la verdad no es cosa de otro mundo. Pero veamoslo paso a paso.</p>
<p>Un Phantom Type, es una tecnica que nos permite hacer chequeo de tipos en tiempo de compilacion manteniendo una gramatica abstracta sencilla y comprensible.</p>
<p>Veamoslo con el ejemplo de la pagina fuente, tenemos un evaluador de expresiones, el cual es reescrito usando gramatica de attributos de esta manera:</p>
<blockquote>
<p>DATA Expr<br />&nbsp;&nbsp; &nbsp;| Val Int<br />&nbsp;&nbsp; &nbsp;| Add le,lr : Expr<br />&nbsp;&nbsp; &nbsp;| LE e1, e2 : Expr<br />&nbsp;&nbsp; &nbsp;| Cond ex, iex, eex : Expr</p>
<p>DERIVING * : Show</p>
<p>ATTR Expr [ | | value : {Res}]</p>
<p>SEM Expr<br />&nbsp;&nbsp; &nbsp;| Val lhs.value &nbsp;= ResI @int<br />&nbsp;&nbsp; &nbsp;| Add lhs.value &nbsp;= case (@le.value, @lr.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ResI x, ResI y) -&gt; ResI (x + y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Add"<br />&nbsp;&nbsp; &nbsp;| LE lhs.value &nbsp; = case (@e1.value, @e2.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ResI x, ResI y) &nbsp;-&gt; ResB (x &lt;= y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; error "Bad Arguments to LE"<br />&nbsp;&nbsp; &nbsp;| Cond lhs.value = case (@ex.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ResB b -&gt; if b then @iex.value else @eex.value<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Cond"</p>
<p>{<br />data Res = ResI Int&nbsp;| ResB Bool &nbsp;deriving Show</p>
<p>main :: IO()<br />main = print e1<br />&nbsp;&nbsp; &nbsp;where e1 = sem_Expr (Cond (LE (Val 3) (Val 5)) (Add (Val 1) (Val 2)) (Val 0))  t;br /&gt;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e2 = sem_Expr (Cond (Val 1) (Val 1) (Val 1))<br />}</p>
</blockquote>
<p>Para probarlo, hacemos "<em>uuagc -mdfcs AExpr.ag</em>", y luego lo cargamos con "<em>ghci AExpr.hs</em>" y lo ejecutamos con "<em>main</em>", y el resultado sera "<em>ResI 3</em>".</p>
<p>Hasta aqui, todo anda bien, pero que pasa si en el ag cambiamos "<em>e1</em>", por "<em>e2</em>" en el "<em>main</em>"?despues ejecutarlo nos da un error de "<em>Bad arguments to Cond</em>", asi como lo esperabamos. Pero que pasaria si <strong>no</strong> queremos obtener estos errores, y que si quisieramos capturar estos errores en tiempo de compilacion?, una forma comun de hacerlo seria cambiando nuestro tipo algebraico y escribiendo una gramatica abstracta que tenga expresiones booleanas, enteras y demas cosas. Pero una forma es usando la tecnica de Phantom Type, como lo mensionamos mas antes, mantenemos una gramatica sencilla y nos permite usar el chequeo de tipos de Haskell.</p>
<p>Entonces, lo reescribimos de esta manera:</p>
<blockquote>
<p>DATA Expr'<br />&nbsp;&nbsp; &nbsp;| Val Int<br />&nbsp;&nbsp; &nbsp;| Add le,lr : Expr'<br />&nbsp;&nbsp; &nbsp;| LE e1, e2 : Expr'<br />&nbsp;&nbsp; &nbsp;| Cond ex, iex, eex : Expr'</p>
<p>DERIVING * : Show</p>
<p>ATTR Expr' [ | | value : {Res}]<br />SEM Expr'<br />&nbsp;&nbsp; &nbsp;| Val lhs.value &nbsp;= ResI @int<br />&nbsp;&nbsp; &nbsp;| Add lhs.value &nbsp;= case (@le.value, @lr.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ResI x, ResI y) -&gt; ResI (x + y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Add"<br />&nbsp;&nbsp; &nbsp;| LE lhs.value &nbsp; = case (@e1.value, @e2.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ResI x, ResI y) &nbsp;-&gt; ResB (x &lt;= y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; error "Bad Arguments to LE"<br />&nbsp;&nbsp; &nbsp;| Cond lhs.value = case (@ex.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ResB b -&gt; if b then @iex.value else @eex.value<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Cond"</p>
<p>{<br />data Res = ResI Int&nbsp;| ResB Bool&nbsp;&nbsp;deriving Show</p>
<p>newtype Expr a = E Expr'<br />&nbsp;&nbsp; &nbsp;deriving (Show)</p>
<p>-- wrappers<br />val :: Int -&gt; Expr Int<br />val = E . Val</p>
<p>add :: Expr Int -&gt; Expr Int -&gt; Expr Int<br />add (E x) (E y) = E $ Add x y</p>
<p>le :: Expr Int -&gt; Expr Int -&gt; Expr Bool<br />le (E x) (E y) = E $ LE x y</p>
<p>cond :: Expr Bool -&gt; Expr a -&gt; Expr a -&gt; Expr a<br />cond (E c) (E x) (E y) = E $ Cond c x y</p>
<p>eval :: Expr a -&gt; Res<br />eval (E e) = sem_Expr' e</p>
<p>main :: IO()<br />main = print e1<br />&nbsp;&nbsp; &nbsp;where e1 = eval (cond (le (val 3) (val 5)) (add (val 1) (val 2)) (val 0))<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --e2 = eval (cond (val 1) (val 1) (val 1))<br />}</p>
</blockquote>
<p>Y ahora, ejecutamos lo mismo que la ultima ves y obtenemos el mismo resultado. Pero si cambiamos "<em>e1</em>" por "<em>e2</em>" en el "<em>main</em>", descomentamos "<em>e2</em>" e intentamos compilarlo, obtendremos un error de tipos en tiempo de compilacion, asi podremos contruir solo expresiones validas para nuestro evaluador.</p>
<p>Donde esta la tecnica de Phantom Type?, los hacemos atraves de "<em>newtype Expr a = E Expr'</em>&nbsp;", el cual crea un nuevo tipo parametrizando el tipo deseado, el cual es controlado por el type chequer de Haskell. Este nuevo tipo, tiene en su contructor de datos algo asi como un tipo fantasma (Phantom Type), esto pienso asi porque:</p>
<blockquote>
<p>-- el tipo del contructor de datos de Expr seria<br />E :: Expr' -&gt; Expr a</p>
<p>-- por ejemplo el tipo de val, es<br />val :: Int -&gt; Expr Int</p>
</blockquote>
<p>Asi el tipo de "<em>Expr a</em>" no refleja el contenido que tiene empaquetado, por eso pienso que el tipo de adentro es el fantasma.</p>
<p>Volviendo al tema, el siguiente paso despues de crear el tipo fantasma, es escribir las funciones wrapper, los cuales se encargan de contruir el "<em>Expr</em>' " que queremos. Y tambien es aqui donde detallamos el chequeo de tipos para Haskell.</p>
<p>En el AG podemos borrar los casos erroneos de los expresiones case, sin afectar los resultados. Y para una mejor presentacion y cuidado, podemos exportar junto con el modulo, solo las funciones wrappers y tipos necesarios.</p>
<p>Bueno, esta es la manera en que implemente Phantom Types con AGs. Si ves el documento fuente, te preguntaras como implemetar GADTs con AGs, pues es algo que yo aun sigo preguntandome, y la verdad no se si habra una manera de hacerlo con AGs, pero como al autor de decia, Phantom Types es una solucion elegante, relativamente sencilla y estandard de Haskell en comparacion con GADTs.</p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep"><h3>Zinep</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/Zinep/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/Zinep/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/Zinep">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/Zinep">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/Zinep">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Zinep"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Hola, disculpa queria saber si me podias ayudar con un ejercicio, veras la lic. Tatiana nos dio unos ejercicios para practicar y la verdad no hicimos mucho sobre la expresion "case", es por eso que cuando trato de realizarlo en winhugs siempre me tira algun error:</p>
<p>Definir una funcion que reciba 6 numeros y devuelva el menor:</p>
<p>mayor6:: Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int</p>
<p>mayor6 a b c d e f g h = case a b c d e f g h of... es AQUI mi duda como hacer esto... agradeceria mucho una ayuda, la verdad es que se poco de la expresion case. Hacer ese ejercicio de forma simple con combinaciones me parece mas sencillo, pero necesito aprender "case" ...GRACIAS</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/Zinep">Zinep</a> hace 166 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Bueno, para explicarte sobre expresiones case, primero debo explicarte sobre pattern matching.<br />Veamos un ejemplo de pattern matching para funciones (sin embargo es posible aplicarlos en varios lugares de haskell):</p>
<blockquote>
<p>data Operacion = Suma Int Int | Resta Int Int<br />-- nuestra funcion sobre el tipo de dato Operacion<br />fun :: Operacion -&gt; Int<br />fun (Suma x y) = x + y<br />fun (Resta x y) = x - y</p>
<p>-- probamos con un ejemplo en la consola "fun (Suma 2 6)"</p>
</blockquote>
<p>Es un ejemplo sencillo que nos muestra el pattern matching en la funcion. Osea el pattern matching trabaja sobre valores especificos de Tipo. En nuestro caso, el tipo es Operacion y sus valores especificos son (Suma int int) (Resta int int). Tambien los valores especificos de un Bool son True y False, de una Lista (de haskell) podria ser (x:xs), de un Char podria ser 'a', y de un Numero Entero (de haskell) podria ser 4,64, y asi sucesivamente.</p>
<p>Entonces, ahora una expresion case, hace uso de pattern matching, de esta manera:</p>
<blockquote>
<p>case TIPO of<br />&nbsp;&nbsp; &nbsp; &nbsp;val1TIPO -&gt; resultado<br />&nbsp;&nbsp; &nbsp; &nbsp;val2TIPO -&gt; resultado<br />&nbsp;&nbsp; &nbsp; &nbsp;...<br />&nbsp;&nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; default</p>
</blockquote>
<p>El pattern matching se encuentra entre TIPO y val1TIPO, val2TIPO ..., esto dependiendo de los valores que pueda contener el determinado tipo. Recuerda que si colocas un pattern matching para enteros, este puede tomar infinitos valores, podrias detallar uno por defecto con el wildcard '_', el cual acepta cualquier valor y de cualquier tipo.</p>
<p>Bueno, eso todo sobre expresiones case. Algo interesante, es que una <em>expresion if-then-else</em>, no es mas que una instancia de una <em>expresion case, en el tipo Bool.</em>&nbsp;Por ejemplo:</p>
<blockquote>
<p>-- la redefinicion de if-then-else es:<br /><strong>if</strong> expr1 <strong>then</strong> expr2 <strong>else</strong> expr3&nbsp;= <br />&nbsp;&nbsp; &nbsp; <strong>case</strong> expr1 <strong>of</strong><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; expr2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; expr3</p>
</blockquote>
<p>Despues de toda esta leccion, espero que hayas entendido la utilidad de case. Ahora ya puedo mostrarte una de las soluciones que hice para el ejercicio que mostraste:</p>
<blockquote>
<p>&nbsp;</p>
<p>menorD6:: Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int<br />menorD6 e1 e2 e3 e4 e5 e6<br />&nbsp;&nbsp;= case e1&lt;=e2 &amp;&amp; e1&lt;=e3 &amp;&amp; e1&lt;=e4 &amp;&amp; e1&lt;=e5 &amp;&amp; e1&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e1<br />&nbsp;&nbsp; &nbsp; &nbsp;False -&gt; case e2&lt;=e1 &amp;&amp; e2&lt;=e3 &amp;&amp; e2&lt;=e4 &amp;&amp; e2&lt;=e5 &amp;&amp; e2&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e3&lt;=e1 &amp;&amp; e3&lt;=e2 &amp;&amp; e3&lt;=e4 &amp;&amp; e3&lt;=e5 &amp;&amp; e3&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e3<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e4&lt;=e1 &amp;&amp; e4&lt;=e2 &amp;&amp; e4&lt;=e3 &amp;&amp; e4&lt;=e5 &amp;&amp; e4&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e4<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e5&lt;=e1 &amp;&amp; e5&lt;=e2 &amp;&amp; e5&lt;=e3 &amp;&amp; e5&lt;=e4 &amp;&amp; e5&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e5<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; e6</p>
</blockquote>
<p>&nbsp;</p>
<blockquote>
<p>&nbsp;</p>
</blockquote>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 165 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep"><h3>Zinep</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/Zinep/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/Zinep/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/Zinep">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/Zinep">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/Zinep">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Zinep"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Muchas gracias :)</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/Zinep">Zinep</a> hace 146 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/annotation/24/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/125/" published="Thu, 25 Mar 2010 01:57:30 +0100" ><![CDATA[<p>Hola, disculpa queria saber si me podias ayudar con un ejercicio, veras la lic. Tatiana nos dio unos ejercicios para practicar y la verdad no hicimos mucho sobre la expresion "case", es por eso que cuando trato de realizarlo en winhugs siempre me tira algun error:</p>
<p>Definir una funcion que reciba 6 numeros y devuelva el menor:</p>
<p>mayor6:: Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int</p>
<p>mayor6 a b c d e f g h = case a b c d e f g h of... es AQUI mi duda como hacer esto... agradeceria mucho una ayuda, la verdad es que se poco de la expresion case. Hacer ese ejercicio de forma simple con combinaciones me parece mas sencillo, pero necesito aprender "case" ...GRACIAS</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/annotation/25/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 26 Mar 2010 06:02:34 +0100" ><![CDATA[<p>Bueno, para explicarte sobre expresiones case, primero debo explicarte sobre pattern matching.<br />Veamos un ejemplo de pattern matching para funciones (sin embargo es posible aplicarlos en varios lugares de haskell):</p>
<blockquote>
<p>data Operacion = Suma Int Int | Resta Int Int<br />-- nuestra funcion sobre el tipo de dato Operacion<br />fun :: Operacion -&gt; Int<br />fun (Suma x y) = x + y<br />fun (Resta x y) = x - y<br /><br />-- probamos con un ejemplo en la consola "fun (Suma 2 6)"</p>
</blockquote>
<p>Es un ejemplo sencillo que nos muestra el pattern matching en la funcion. Osea el pattern matching trabaja sobre valores especificos de Tipo. En nuestro caso, el tipo es Operacion y sus valores especificos son (Suma int int) (Resta int int). Tambien los valores especificos de un Bool son True y False, de una Lista (de haskell) podria ser (x:xs), de un Char podria ser 'a', y de un Numero Entero (de haskell) podria ser 4,64, y asi sucesivamente.</p>
<p>Entonces, ahora una expresion case, hace uso de pattern matching, de esta manera:</p>
<blockquote>
<p>case TIPO of<br />&nbsp;&nbsp; &nbsp; &nbsp;val1TIPO -&gt; resultado<br />&nbsp;&nbsp; &nbsp; &nbsp;val2TIPO -&gt; resultado<br />&nbsp;&nbsp; &nbsp; &nbsp;...<br />&nbsp;&nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; default</p>
</blockquote>
<p>El pattern matching se encuentra entre TIPO y val1TIPO, val2TIPO ..., esto dependiendo de los valores que pueda contener el determinado tipo. Recuerda que si colocas un pattern matching para enteros, este puede tomar infinitos valores, podrias detallar uno por defecto con el wildcard '_', el cual acepta cualquier valor y de cualquier tipo.</p>
<p>Bueno, eso todo sobre expresiones case. Algo interesante, es que una <em>expresion if-then-else</em>, no es mas que una instancia de una <em>expresion case, en el tipo Bool.</em>&nbsp;Por ejemplo:</p>
<blockquote>
<p>-- la redefinicion de if-then-else es:<br /><strong>if</strong> expr1 <strong>then</strong> expr2 <strong>else</strong> expr3&nbsp;= <br />&nbsp;&nbsp; &nbsp; <strong>case</strong> expr1 <strong>of</strong><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; expr2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; expr3</p>
</blockquote>
<p>Despues de toda esta leccion, espero que hayas entendido la utilidad de case. Ahora ya puedo mostrarte una de las soluciones que hice para el ejercicio que mostraste:</p>
<blockquote>
<p>&nbsp;</p>
<p>menorD6:: Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int<br />menorD6 e1 e2 e3 e4 e5 e6<br />&nbsp;&nbsp;= case e1&lt;=e2 &amp;&amp; e1&lt;=e3 &amp;&amp; e1&lt;=e4 &amp;&amp; e1&lt;=e5 &amp;&amp; e1&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e1<br />&nbsp;&nbsp; &nbsp; &nbsp;False -&gt; case e2&lt;=e1 &amp;&amp; e2&lt;=e3 &amp;&amp; e2&lt;=e4 &amp;&amp; e2&lt;=e5 &amp;&amp; e2&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e3&lt;=e1 &amp;&amp; e3&lt;=e2 &amp;&amp; e3&lt;=e4 &amp;&amp; e3&lt;=e5 &amp;&amp; e3&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e3<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e4&lt;=e1 &amp;&amp; e4&lt;=e2 &amp;&amp; e4&lt;=e3 &amp;&amp; e4&lt;=e5 &amp;&amp; e4&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e4<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e5&lt;=e1 &amp;&amp; e5&lt;=e2 &amp;&amp; e5&lt;=e3 &amp;&amp; e5&lt;=e4 &amp;&amp; e5&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e5<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; e6</p>
</blockquote>
<p>&nbsp;</p>
<blockquote>
<p>&nbsp;</p>
</blockquote>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/annotation/27/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/125/" published="Tue, 13 Apr 2010 17:23:46 +0200" ><![CDATA[<p>Muchas gracias :)</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/1124/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 28 Apr 2010 06:39:05 +0200" ><![CDATA[phantom types]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/1123/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 28 Apr 2010 06:39:05 +0200" ><![CDATA[tipos fantasmas]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/1122/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 28 Apr 2010 06:39:05 +0200" ><![CDATA[uuagc]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/1121/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 28 Apr 2010 06:39:05 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/970/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/124/" class="object" subclass="blog" published="Wed, 24 Mar 2010 07:29:11 +0100" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="owner_uuid" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="container_uuid" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="title" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[Phantom Types con uuagc]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="description" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[<p>Despues de entender <a href="http://ajayu.memi.umss.edu.bo/tati/weblog/dsls-haskell-gadts-phantom-types" target="_blank" title="Phanton Types">Phantom Types</a>, me puse a ver la manera de hacerlo con AGs (Attribute Grammar), y la verdad no es cosa de otro mundo. Pero veamoslo paso a paso.</p>
<p>Un Phantom Type, es una tecnica que nos permite hacer chequeo de tipos en tiempo de compilacion manteniendo una gramatica abstracta sencilla y comprensible.</p>
<p>Veamoslo con el ejemplo de la pagina fuente, tenemos un evaluador de expresiones, el cual es reescrito usando gramatica de attributos de esta manera:</p>
<blockquote>
<p>DATA Expr<br />&nbsp;&nbsp; &nbsp;| Val Int<br />&nbsp;&nbsp; &nbsp;| Add le,lr : Expr<br />&nbsp;&nbsp; &nbsp;| LE e1, e2 : Expr<br />&nbsp;&nbsp; &nbsp;| Cond ex, iex, eex : Expr</p>
<p>DERIVING * : Show</p>
<p>ATTR Expr [ | | value : {Res}]</p>
<p>SEM Expr<br />&nbsp;&nbsp; &nbsp;| Val lhs.value &nbsp;= ResI @int<br />&nbsp;&nbsp; &nbsp;| Add lhs.value &nbsp;= case (@le.value, @lr.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ResI x, ResI y) -&gt; ResI (x + y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Add"<br />&nbsp;&nbsp; &nbsp;| LE lhs.value &nbsp; = case (@e1.value, @e2.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ResI x, ResI y) &nbsp;-&gt; ResB (x &lt;= y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; error "Bad Arguments to LE"<br />&nbsp;&nbsp; &nbsp;| Cond lhs.value = case (@ex.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ResB b -&gt; if b then @iex.value else @eex.value<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Cond"</p>
<p>{<br />data Res = ResI Int&nbsp;| ResB Bool &nbsp;deriving Show</p>
<p>main :: IO()<br />main = print e1<br />&nbsp;&nbsp; &nbsp;where e1 = sem_Expr (Cond (LE (Val 3) (Val 5)) (Add (Val 1) (Val 2)) (Val 0))  t;br /&gt;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e2 = sem_Expr (Cond (Val 1) (Val 1) (Val 1))<br />}</p>
</blockquote>
<p>Para probarlo, hacemos "<em>uuagc -mdfcs AExpr.ag</em>", y luego lo cargamos con "<em>ghci AExpr.hs</em>" y lo ejecutamos con "<em>main</em>", y el resultado sera "<em>ResI 3</em>".</p>
<p>Hasta aqui, todo anda bien, pero que pasa si en el ag cambiamos "<em>e1</em>", por "<em>e2</em>" en el "<em>main</em>"?despues ejecutarlo nos da un error de "<em>Bad arguments to Cond</em>", asi como lo esperabamos. Pero que pasaria si <strong>no</strong> queremos obtener estos errores, y que si quisieramos capturar estos errores en tiempo de compilacion?, una forma comun de hacerlo seria cambiando nuestro tipo algebraico y escribiendo una gramatica abstracta que tenga expresiones booleanas, enteras y demas cosas. Pero una forma es usando la tecnica de Phantom Type, como lo mensionamos mas antes, mantenemos una gramatica sencilla y nos permite usar el chequeo de tipos de Haskell.</p>
<p>Entonces, lo reescribimos de esta manera:</p>
<blockquote>
<p>DATA Expr'<br />&nbsp;&nbsp; &nbsp;| Val Int<br />&nbsp;&nbsp; &nbsp;| Add le,lr : Expr'<br />&nbsp;&nbsp; &nbsp;| LE e1, e2 : Expr'<br />&nbsp;&nbsp; &nbsp;| Cond ex, iex, eex : Expr'</p>
<p>DERIVING * : Show</p>
<p>ATTR Expr' [ | | value : {Res}]<br />SEM Expr'<br />&nbsp;&nbsp; &nbsp;| Val lhs.value &nbsp;= ResI @int<br />&nbsp;&nbsp; &nbsp;| Add lhs.value &nbsp;= case (@le.value, @lr.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ResI x, ResI y) -&gt; ResI (x + y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Add"<br />&nbsp;&nbsp; &nbsp;| LE lhs.value &nbsp; = case (@e1.value, @e2.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ResI x, ResI y) &nbsp;-&gt; ResB (x &lt;= y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; error "Bad Arguments to LE"<br />&nbsp;&nbsp; &nbsp;| Cond lhs.value = case (@ex.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ResB b -&gt; if b then @iex.value else @eex.value<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Cond"</p>
<p>{<br />data Res = ResI Int&nbsp;| ResB Bool&nbsp;&nbsp;deriving Show</p>
<p>newtype Expr a = E Expr'<br />&nbsp;&nbsp; &nbsp;deriving (Show)</p>
<p>-- wrappers<br />val :: Int -&gt; Expr Int<br />val = E . Val</p>
<p>add :: Expr Int -&gt; Expr Int -&gt; Expr Int<br />add (E x) (E y) = E $ Add x y</p>
<p>le :: Expr Int -&gt; Expr Int -&gt; Expr Bool<br />le (E x) (E y) = E $ LE x y</p>
<p>cond :: Expr Bool -&gt; Expr a -&gt; Expr a -&gt; Expr a<br />cond (E c) (E x) (E y) = E $ Cond c x y</p>
<p>eval :: Expr a -&gt; Res<br />eval (E e) = sem_Expr' e</p>
<p>main :: IO()<br />main = print e1<br />&nbsp;&nbsp; &nbsp;where e1 = eval (cond (le (val 3) (val 5)) (add (val 1) (val 2)) (val 0))<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --e2 = eval (cond (val 1) (val 1) (val 1))<br />}</p>
</blockquote>
<p>Y ahora, ejecutamos lo mismo que la ultima ves y obtenemos el mismo resultado. Pero si cambiamos "<em>e1</em>" por "<em>e2</em>" en el "<em>main</em>", descomentamos "<em>e2</em>" e intentamos compilarlo, obtendremos un error de tipos en tiempo de compilacion, asi podremos contruir solo expresiones validas para nuestro evaluador.</p>
<p>Donde esta la tecnica de Phantom Type?, los hacemos atraves de "<em>newtype Expr a = E Expr'</em>&nbsp;", el cual crea un nuevo tipo parametrizando el tipo deseado, el cual es controlado por el type chequer de Haskell. Este nuevo tipo, tiene en su contructor de datos algo asi como un tipo fantasma (Phantom Type), esto pienso asi porque:</p>
<blockquote>
<p>-- el tipo del contructor de datos de Expr seria<br />E :: Expr' -&gt; Expr a<br /><br />-- por ejemplo el tipo de val, es<br />val :: Int -&gt; Expr Int</p>
</blockquote>
<p>Asi el tipo de "<em>Expr a</em>" no refleja el contenido que tiene empaquetado, por eso pienso que el tipo de adentro es el fantasma.</p>
<p>Volviendo al tema, el siguiente paso despues de crear el tipo fantasma, es escribir las funciones wrapper, los cuales se encargan de contruir el "<em>Expr</em>' " que queremos. Y tambien es aqui donde detallamos el chequeo de tipos para Haskell.</p>
<p>En el AG podemos borrar los casos erroneos de los expresiones case, sin afectar los resultados. Y para una mejor presentacion y cuidado, podemos exportar junto con el modulo, solo las funciones wrappers y tipos necesarios.</p>
<p>Bueno, esta es la manera en que implemente Phantom Types con AGs. Si ves el documento fuente, te preguntaras como implemetar GADTs con AGs, pues es algo que yo aun sigo preguntandome, y la verdad no se si habra una manera de hacerlo con AGs, pero como al autor de decia, Phantom Types es una solucion elegante, relativamente sencilla y estandard de Haskell en comparacion con GADTs.</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/124/phantom-types-con-uuagc">Phantom Types con uuagc</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				March 24, 2010				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/124/phantom-types-con-uuagc">Comentarios (3)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/phantom+types">phantom types</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/tipos+fantasmas">tipos fantasmas</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/uuagc">uuagc</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Despues de entender <a href="http://ajayu.memi.umss.edu.bo/tati/weblog/dsls-haskell-gadts-phantom-types" target="_blank" title="Phanton Types">Phantom Types</a>, me puse a ver la manera de hacerlo con AGs (Attribute Grammar), y la verdad no es cosa de otro mundo. Pero veamoslo paso a paso.</p>
<p>Un Phantom Type, es una tecnica que nos permite hacer chequeo de tipos en tiempo de compilacion manteniendo una gramatica abstracta sencilla y comprensible.</p>
<p>Veamoslo con el ejemplo de la pagina fuente, tenemos un evaluador de expresiones, el cual es reescrito usando gramatica de attributos de esta manera:</p>
<blockquote>
<p>DATA Expr<br />&nbsp;&nbsp; &nbsp;| Val Int<br />&nbsp;&nbsp; &nbsp;| Add le,lr : Expr<br />&nbsp;&nbsp; &nbsp;| LE e1, e2 : Expr<br />&nbsp;&nbsp; &nbsp;| Cond ex, iex, eex : Expr</p>
<p>DERIVING * : Show</p>
<p>ATTR Expr [ | | value : {Res}]</p>
<p>SEM Expr<br />&nbsp;&nbsp; &nbsp;| Val lhs.value &nbsp;= ResI @int<br />&nbsp;&nbsp; &nbsp;| Add lhs.value &nbsp;= case (@le.value, @lr.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ResI x, ResI y) -&gt; ResI (x + y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Add"<br />&nbsp;&nbsp; &nbsp;| LE lhs.value &nbsp; = case (@e1.value, @e2.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ResI x, ResI y) &nbsp;-&gt; ResB (x &lt;= y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; error "Bad Arguments to LE"<br />&nbsp;&nbsp; &nbsp;| Cond lhs.value = case (@ex.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ResB b -&gt; if b then @iex.value else @eex.value<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Cond"</p>
<p>{<br />data Res = ResI Int&nbsp;| ResB Bool &nbsp;deriving Show</p>
<p>main :: IO()<br />main = print e1<br />&nbsp;&nbsp; &nbsp;where e1 = sem_Expr (Cond (LE (Val 3) (Val 5)) (Add (Val 1) (Val 2)) (Val 0))  t;br /&gt;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e2 = sem_Expr (Cond (Val 1) (Val 1) (Val 1))<br />}</p>
</blockquote>
<p>Para probarlo, hacemos "<em>uuagc -mdfcs AExpr.ag</em>", y luego lo cargamos con "<em>ghci AExpr.hs</em>" y lo ejecutamos con "<em>main</em>", y el resultado sera "<em>ResI 3</em>".</p>
<p>Hasta aqui, todo anda bien, pero que pasa si en el ag cambiamos "<em>e1</em>", por "<em>e2</em>" en el "<em>main</em>"?despues ejecutarlo nos da un error de "<em>Bad arguments to Cond</em>", asi como lo esperabamos. Pero que pasaria si <strong>no</strong> queremos obtener estos errores, y que si quisieramos capturar estos errores en tiempo de compilacion?, una forma comun de hacerlo seria cambiando nuestro tipo algebraico y escribiendo una gramatica abstracta que tenga expresiones booleanas, enteras y demas cosas. Pero una forma es usando la tecnica de Phantom Type, como lo mensionamos mas antes, mantenemos una gramatica sencilla y nos permite usar el chequeo de tipos de Haskell.</p>
<p>Entonces, lo reescribimos de esta manera:</p>
<blockquote>
<p>DATA Expr'<br />&nbsp;&nbsp; &nbsp;| Val Int<br />&nbsp;&nbsp; &nbsp;| Add le,lr : Expr'<br />&nbsp;&nbsp; &nbsp;| LE e1, e2 : Expr'<br />&nbsp;&nbsp; &nbsp;| Cond ex, iex, eex : Expr'</p>
<p>DERIVING * : Show</p>
<p>ATTR Expr' [ | | value : {Res}]<br />SEM Expr'<br />&nbsp;&nbsp; &nbsp;| Val lhs.value &nbsp;= ResI @int<br />&nbsp;&nbsp; &nbsp;| Add lhs.value &nbsp;= case (@le.value, @lr.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ResI x, ResI y) -&gt; ResI (x + y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Add"<br />&nbsp;&nbsp; &nbsp;| LE lhs.value &nbsp; = case (@e1.value, @e2.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ResI x, ResI y) &nbsp;-&gt; ResB (x &lt;= y)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; error "Bad Arguments to LE"<br />&nbsp;&nbsp; &nbsp;| Cond lhs.value = case (@ex.value) of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ResB b -&gt; if b then @iex.value else @eex.value<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp;-&gt; error "Bad Arguments to Cond"</p>
<p>{<br />data Res = ResI Int&nbsp;| ResB Bool&nbsp;&nbsp;deriving Show</p>
<p>newtype Expr a = E Expr'<br />&nbsp;&nbsp; &nbsp;deriving (Show)</p>
<p>-- wrappers<br />val :: Int -&gt; Expr Int<br />val = E . Val</p>
<p>add :: Expr Int -&gt; Expr Int -&gt; Expr Int<br />add (E x) (E y) = E $ Add x y</p>
<p>le :: Expr Int -&gt; Expr Int -&gt; Expr Bool<br />le (E x) (E y) = E $ LE x y</p>
<p>cond :: Expr Bool -&gt; Expr a -&gt; Expr a -&gt; Expr a<br />cond (E c) (E x) (E y) = E $ Cond c x y</p>
<p>eval :: Expr a -&gt; Res<br />eval (E e) = sem_Expr' e</p>
<p>main :: IO()<br />main = print e1<br />&nbsp;&nbsp; &nbsp;where e1 = eval (cond (le (val 3) (val 5)) (add (val 1) (val 2)) (val 0))<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --e2 = eval (cond (val 1) (val 1) (val 1))<br />}</p>
</blockquote>
<p>Y ahora, ejecutamos lo mismo que la ultima ves y obtenemos el mismo resultado. Pero si cambiamos "<em>e1</em>" por "<em>e2</em>" en el "<em>main</em>", descomentamos "<em>e2</em>" e intentamos compilarlo, obtendremos un error de tipos en tiempo de compilacion, asi podremos contruir solo expresiones validas para nuestro evaluador.</p>
<p>Donde esta la tecnica de Phantom Type?, los hacemos atraves de "<em>newtype Expr a = E Expr'</em>&nbsp;", el cual crea un nuevo tipo parametrizando el tipo deseado, el cual es controlado por el type chequer de Haskell. Este nuevo tipo, tiene en su contructor de datos algo asi como un tipo fantasma (Phantom Type), esto pienso asi porque:</p>
<blockquote>
<p>-- el tipo del contructor de datos de Expr seria<br />E :: Expr' -&gt; Expr a</p>
<p>-- por ejemplo el tipo de val, es<br />val :: Int -&gt; Expr Int</p>
</blockquote>
<p>Asi el tipo de "<em>Expr a</em>" no refleja el contenido que tiene empaquetado, por eso pienso que el tipo de adentro es el fantasma.</p>
<p>Volviendo al tema, el siguiente paso despues de crear el tipo fantasma, es escribir las funciones wrapper, los cuales se encargan de contruir el "<em>Expr</em>' " que queremos. Y tambien es aqui donde detallamos el chequeo de tipos para Haskell.</p>
<p>En el AG podemos borrar los casos erroneos de los expresiones case, sin afectar los resultados. Y para una mejor presentacion y cuidado, podemos exportar junto con el modulo, solo las funciones wrappers y tipos necesarios.</p>
<p>Bueno, esta es la manera en que implemente Phantom Types con AGs. Si ves el documento fuente, te preguntaras como implemetar GADTs con AGs, pues es algo que yo aun sigo preguntandome, y la verdad no se si habra una manera de hacerlo con AGs, pero como al autor de decia, Phantom Types es una solucion elegante, relativamente sencilla y estandard de Haskell en comparacion con GADTs.</p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep"><h3>Zinep</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/Zinep/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/Zinep/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/Zinep">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/Zinep">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/Zinep">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Zinep"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Hola, disculpa queria saber si me podias ayudar con un ejercicio, veras la lic. Tatiana nos dio unos ejercicios para practicar y la verdad no hicimos mucho sobre la expresion "case", es por eso que cuando trato de realizarlo en winhugs siempre me tira algun error:</p>
<p>Definir una funcion que reciba 6 numeros y devuelva el menor:</p>
<p>mayor6:: Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int</p>
<p>mayor6 a b c d e f g h = case a b c d e f g h of... es AQUI mi duda como hacer esto... agradeceria mucho una ayuda, la verdad es que se poco de la expresion case. Hacer ese ejercicio de forma simple con combinaciones me parece mas sencillo, pero necesito aprender "case" ...GRACIAS</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/Zinep">Zinep</a> hace 166 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Bueno, para explicarte sobre expresiones case, primero debo explicarte sobre pattern matching.<br />Veamos un ejemplo de pattern matching para funciones (sin embargo es posible aplicarlos en varios lugares de haskell):</p>
<blockquote>
<p>data Operacion = Suma Int Int | Resta Int Int<br />-- nuestra funcion sobre el tipo de dato Operacion<br />fun :: Operacion -&gt; Int<br />fun (Suma x y) = x + y<br />fun (Resta x y) = x - y</p>
<p>-- probamos con un ejemplo en la consola "fun (Suma 2 6)"</p>
</blockquote>
<p>Es un ejemplo sencillo que nos muestra el pattern matching en la funcion. Osea el pattern matching trabaja sobre valores especificos de Tipo. En nuestro caso, el tipo es Operacion y sus valores especificos son (Suma int int) (Resta int int). Tambien los valores especificos de un Bool son True y False, de una Lista (de haskell) podria ser (x:xs), de un Char podria ser 'a', y de un Numero Entero (de haskell) podria ser 4,64, y asi sucesivamente.</p>
<p>Entonces, ahora una expresion case, hace uso de pattern matching, de esta manera:</p>
<blockquote>
<p>case TIPO of<br />&nbsp;&nbsp; &nbsp; &nbsp;val1TIPO -&gt; resultado<br />&nbsp;&nbsp; &nbsp; &nbsp;val2TIPO -&gt; resultado<br />&nbsp;&nbsp; &nbsp; &nbsp;...<br />&nbsp;&nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; default</p>
</blockquote>
<p>El pattern matching se encuentra entre TIPO y val1TIPO, val2TIPO ..., esto dependiendo de los valores que pueda contener el determinado tipo. Recuerda que si colocas un pattern matching para enteros, este puede tomar infinitos valores, podrias detallar uno por defecto con el wildcard '_', el cual acepta cualquier valor y de cualquier tipo.</p>
<p>Bueno, eso todo sobre expresiones case. Algo interesante, es que una <em>expresion if-then-else</em>, no es mas que una instancia de una <em>expresion case, en el tipo Bool.</em>&nbsp;Por ejemplo:</p>
<blockquote>
<p>-- la redefinicion de if-then-else es:<br /><strong>if</strong> expr1 <strong>then</strong> expr2 <strong>else</strong> expr3&nbsp;= <br />&nbsp;&nbsp; &nbsp; <strong>case</strong> expr1 <strong>of</strong><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; expr2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; expr3</p>
</blockquote>
<p>Despues de toda esta leccion, espero que hayas entendido la utilidad de case. Ahora ya puedo mostrarte una de las soluciones que hice para el ejercicio que mostraste:</p>
<blockquote>
<p>&nbsp;</p>
<p>menorD6:: Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int<br />menorD6 e1 e2 e3 e4 e5 e6<br />&nbsp;&nbsp;= case e1&lt;=e2 &amp;&amp; e1&lt;=e3 &amp;&amp; e1&lt;=e4 &amp;&amp; e1&lt;=e5 &amp;&amp; e1&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e1<br />&nbsp;&nbsp; &nbsp; &nbsp;False -&gt; case e2&lt;=e1 &amp;&amp; e2&lt;=e3 &amp;&amp; e2&lt;=e4 &amp;&amp; e2&lt;=e5 &amp;&amp; e2&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e3&lt;=e1 &amp;&amp; e3&lt;=e2 &amp;&amp; e3&lt;=e4 &amp;&amp; e3&lt;=e5 &amp;&amp; e3&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e3<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e4&lt;=e1 &amp;&amp; e4&lt;=e2 &amp;&amp; e4&lt;=e3 &amp;&amp; e4&lt;=e5 &amp;&amp; e4&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e4<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e5&lt;=e1 &amp;&amp; e5&lt;=e2 &amp;&amp; e5&lt;=e3 &amp;&amp; e5&lt;=e4 &amp;&amp; e5&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e5<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; e6</p>
</blockquote>
<p>&nbsp;</p>
<blockquote>
<p>&nbsp;</p>
</blockquote>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 165 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep"><h3>Zinep</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/Zinep/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/Zinep/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/Zinep">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/Zinep">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/Zinep">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/Zinep" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Zinep"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Muchas gracias :)</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/Zinep">Zinep</a> hace 146 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/annotation/24/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/125/" published="Thu, 25 Mar 2010 01:57:30 +0100" ><![CDATA[<p>Hola, disculpa queria saber si me podias ayudar con un ejercicio, veras la lic. Tatiana nos dio unos ejercicios para practicar y la verdad no hicimos mucho sobre la expresion "case", es por eso que cuando trato de realizarlo en winhugs siempre me tira algun error:</p>
<p>Definir una funcion que reciba 6 numeros y devuelva el menor:</p>
<p>mayor6:: Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int</p>
<p>mayor6 a b c d e f g h = case a b c d e f g h of... es AQUI mi duda como hacer esto... agradeceria mucho una ayuda, la verdad es que se poco de la expresion case. Hacer ese ejercicio de forma simple con combinaciones me parece mas sencillo, pero necesito aprender "case" ...GRACIAS</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/annotation/25/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 26 Mar 2010 06:02:34 +0100" ><![CDATA[<p>Bueno, para explicarte sobre expresiones case, primero debo explicarte sobre pattern matching.<br />Veamos un ejemplo de pattern matching para funciones (sin embargo es posible aplicarlos en varios lugares de haskell):</p>
<blockquote>
<p>data Operacion = Suma Int Int | Resta Int Int<br />-- nuestra funcion sobre el tipo de dato Operacion<br />fun :: Operacion -&gt; Int<br />fun (Suma x y) = x + y<br />fun (Resta x y) = x - y<br /><br />-- probamos con un ejemplo en la consola "fun (Suma 2 6)"</p>
</blockquote>
<p>Es un ejemplo sencillo que nos muestra el pattern matching en la funcion. Osea el pattern matching trabaja sobre valores especificos de Tipo. En nuestro caso, el tipo es Operacion y sus valores especificos son (Suma int int) (Resta int int). Tambien los valores especificos de un Bool son True y False, de una Lista (de haskell) podria ser (x:xs), de un Char podria ser 'a', y de un Numero Entero (de haskell) podria ser 4,64, y asi sucesivamente.</p>
<p>Entonces, ahora una expresion case, hace uso de pattern matching, de esta manera:</p>
<blockquote>
<p>case TIPO of<br />&nbsp;&nbsp; &nbsp; &nbsp;val1TIPO -&gt; resultado<br />&nbsp;&nbsp; &nbsp; &nbsp;val2TIPO -&gt; resultado<br />&nbsp;&nbsp; &nbsp; &nbsp;...<br />&nbsp;&nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -&gt; default</p>
</blockquote>
<p>El pattern matching se encuentra entre TIPO y val1TIPO, val2TIPO ..., esto dependiendo de los valores que pueda contener el determinado tipo. Recuerda que si colocas un pattern matching para enteros, este puede tomar infinitos valores, podrias detallar uno por defecto con el wildcard '_', el cual acepta cualquier valor y de cualquier tipo.</p>
<p>Bueno, eso todo sobre expresiones case. Algo interesante, es que una <em>expresion if-then-else</em>, no es mas que una instancia de una <em>expresion case, en el tipo Bool.</em>&nbsp;Por ejemplo:</p>
<blockquote>
<p>-- la redefinicion de if-then-else es:<br /><strong>if</strong> expr1 <strong>then</strong> expr2 <strong>else</strong> expr3&nbsp;= <br />&nbsp;&nbsp; &nbsp; <strong>case</strong> expr1 <strong>of</strong><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; expr2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; expr3</p>
</blockquote>
<p>Despues de toda esta leccion, espero que hayas entendido la utilidad de case. Ahora ya puedo mostrarte una de las soluciones que hice para el ejercicio que mostraste:</p>
<blockquote>
<p>&nbsp;</p>
<p>menorD6:: Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int -&gt; Int<br />menorD6 e1 e2 e3 e4 e5 e6<br />&nbsp;&nbsp;= case e1&lt;=e2 &amp;&amp; e1&lt;=e3 &amp;&amp; e1&lt;=e4 &amp;&amp; e1&lt;=e5 &amp;&amp; e1&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e1<br />&nbsp;&nbsp; &nbsp; &nbsp;False -&gt; case e2&lt;=e1 &amp;&amp; e2&lt;=e3 &amp;&amp; e2&lt;=e4 &amp;&amp; e2&lt;=e5 &amp;&amp; e2&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e3&lt;=e1 &amp;&amp; e3&lt;=e2 &amp;&amp; e3&lt;=e4 &amp;&amp; e3&lt;=e5 &amp;&amp; e3&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e3<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e4&lt;=e1 &amp;&amp; e4&lt;=e2 &amp;&amp; e4&lt;=e3 &amp;&amp; e4&lt;=e5 &amp;&amp; e4&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e4<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; case e5&lt;=e1 &amp;&amp; e5&lt;=e2 &amp;&amp; e5&lt;=e3 &amp;&amp; e5&lt;=e4 &amp;&amp; e5&lt;=e6 of<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;True &nbsp;-&gt; e5<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False -&gt; e6</p>
</blockquote>
<p>&nbsp;</p>
<blockquote>
<p>&nbsp;</p>
</blockquote>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/annotation/27/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/125/" published="Tue, 13 Apr 2010 17:23:46 +0200" ><![CDATA[<p>Muchas gracias :)</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/1124/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 28 Apr 2010 06:39:05 +0200" ><![CDATA[phantom types]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/1123/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 28 Apr 2010 06:39:05 +0200" ><![CDATA[tipos fantasmas]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/1122/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 28 Apr 2010 06:39:05 +0200" ><![CDATA[uuagc]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/1121/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 28 Apr 2010 06:39:05 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/124/metadata/970/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/124/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 24 Mar 2010 07:29:11 +0100" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/107/" class="object" subclass="blog" published="Tue, 09 Feb 2010 16:20:59 +0100" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="owner_uuid" published="Tue, 09 Feb 2010 16:20:59 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="container_uuid" published="Tue, 09 Feb 2010 16:20:59 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="title" published="Tue, 09 Feb 2010 16:20:59 +0100" ><![CDATA[Estructuras de Datos Funcionales vs. Imperativas]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="description" published="Tue, 09 Feb 2010 16:20:59 +0100" ><![CDATA[<p>En esta oportunidad quiero compartir una traduccion de una de los subtitulos del libro: Purely Functional Data Structure [Chris Okasaki], que me parecio muy buena.</p>
<p><strong>Estructuras de Datos Funcionales vs. Imperativas</strong></p>
<p>Los beneficios metodologicos de los lenguajes funcionales son bien conocidos, pero aun la mayoria de los programas son escritos en lenguajes imperativos como C. Esta aparente contradiccion es facilmente explicado por el hecho de que los lenguajes funcionales han sido historicamente mas lentos que sus mas tradicionales primos, pero esta brecha se esta reduciendo. Se han hecho impresionantes avances desde un amplio frente, desde tecnologias basicas de compiladores a analisis sofisticados y optimizaciones. Sin embargo, hay un aspecto de la programacion funcional que todo escritor de compiladores debe mitigar - el uso de&nbsp;estructuras de datos&nbsp;inapropiadas o inferiores.</p>
<p>Porque las estructuras de datos funcionales son mas dificultuosas para dise&ntilde;ar e implementar que las imperativas? Hay 2 problemas basicos. Primero, desde el punto de vista de dise&ntilde;o e implementacion de estructuras de datos eficientes, la estructura de la programacion funcional contra actualizaciones destructivas (ej. asignaciones) es una desventaja asombrosa, equivalente a confiscar los cuchillos de un chef master. Al igual que los cuchillos, las actualizaciones destructivas pueden ser da&ntilde;inas cuando son mal usadas, pero tremendamente efectivas cuando son usadas apropiadamente. Las estructuras de datos imperativas a menudo confian en la asignacion de una forma crucial, y por eso se encuentran diferentes soluciones para los programas funcionales.</p>
<p>La segunda dificultad es que se espera que las estructuras de datos funcionales sean mas flexibles que sus contrapartes imperativas. En particular, cuando actualizamos una estructura de datos imperativa, tipicamente aceptamos que la version antigua de la estructura de datos ya no estara disponible, pero cuando actualizamos una estructura de datos funcional, esperamos que la antigua y nueva version de la estructura de datos estara disponible para futuros procesamientos. Una estructura de datos que soporta multiples versiones es llamado <em>persistente [persistent]</em>, mientras que una estrutura de datos que permite solo una simple version en un tiempo es llamado <em>efimera [ephemeral]</em>. Los lenguajes de programacion funcional tienen la propiedad curiosa de que todas las estructuras de datos son auntomaticamente persistentes.&nbsp;<br />Las estructuras de datos imperativas son tipicamente efimeras, pero cuando una estructura de datos persistente es requerida, los programadores imperativos no se sorprenden si la estructura de datos persistente es mas complicada y talves incluso asintoticamente menos eficiente que una equivalente estructura de datos efimera.</p>
<p>Ademas, los teoricos han establecido limites inferiores sugeriendo que los lenguajes de programacion funcional podrian ser fundamentalmente menos eficientes que los lenguajes imperativos en algunas situaciones. En vista de todos estos puntos, las estructuras de datos funcionales se parecen algunas veces al oso que baila, de quien se dice, "lo maravilloso no es que el danza muy bien, sino de  que el danza de alguna manera!". En la practica, sin embargo, la situacion no es tan triste. Como podremos ver, es a menudo posible eleborar estructuras de datos funcionales que son asintoticamente tan eficientes como las mejores soluciones imperativas.</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/107/estructuras-de-datos-funcionales-vs-imperativas">Estructuras de Datos Funcionales vs. Imperativas</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				February 9, 2010				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/107/estructuras-de-datos-funcionales-vs-imperativas">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Estructuras+de+Datos+Funcionales">Estructuras de Datos Funcionales</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>En esta oportunidad quiero compartir una traduccion de una de los subtitulos del libro: Purely Functional Data Structure [Chris Okasaki], que me parecio muy buena.</p>
<p><strong>Estructuras de Datos Funcionales vs. Imperativas</strong></p>
<p>Los beneficios metodologicos de los lenguajes funcionales son bien conocidos, pero aun la mayoria de los programas son escritos en lenguajes imperativos como C. Esta aparente contradiccion es facilmente explicado por el hecho de que los lenguajes funcionales han sido historicamente mas lentos que sus mas tradicionales primos, pero esta brecha se esta reduciendo. Se han hecho impresionantes avances desde un amplio frente, desde tecnologias basicas de compiladores a analisis sofisticados y optimizaciones. Sin embargo, hay un aspecto de la programacion funcional que todo escritor de compiladores debe mitigar - el uso de&nbsp;estructuras de datos&nbsp;inapropiadas o inferiores.</p>
<p>Porque las estructuras de datos funcionales son mas dificultuosas para dise&ntilde;ar e implementar que las imperativas? Hay 2 problemas basicos. Primero, desde el punto de vista de dise&ntilde;o e implementacion de estructuras de datos eficientes, la estructura de la programacion funcional contra actualizaciones destructivas (ej. asignaciones) es una desventaja asombrosa, equivalente a confiscar los cuchillos de un chef master. Al igual que los cuchillos, las actualizaciones destructivas pueden ser da&ntilde;inas cuando son mal usadas, pero tremendamente efectivas cuando son usadas apropiadamente. Las estructuras de datos imperativas a menudo confian en la asignacion de una forma crucial, y por eso se encuentran diferentes soluciones para los programas funcionales.</p>
<p>La segunda dificultad es que se espera que las estructuras de datos funcionales sean mas flexibles que sus contrapartes imperativas. En particular, cuando actualizamos una estructura de datos imperativa, tipicamente aceptamos que la version antigua de la estructura de datos ya no estara disponible, pero cuando actualizamos una estructura de datos funcional, esperamos que la antigua y nueva version de la estructura de datos estara disponible para futuros procesamientos. Una estructura de datos que soporta multiples versiones es llamado <em>persistente [persistent]</em>, mientras que una estrutura de datos que permite solo una simple version en un tiempo es llamado <em>efimera [ephemeral]</em>. Los lenguajes de programacion funcional tienen la propiedad curiosa de que todas las estructuras de datos son auntomaticamente persistentes.&nbsp;<br />Las estructuras de datos imperativas son tipicamente efimeras, pero cuando una estructura de datos persistente es requerida, los programadores imperativos no se sorprenden si la estructura de datos persistente es mas complicada y talves incluso asintoticamente menos eficiente que una equivalente estructura de datos efimera.</p>
<p>Ademas, los teoricos han establecido limites inferiores sugeriendo que los lenguajes de programacion funcional podrian ser fundamentalmente menos eficientes que los lenguajes imperativos en algunas situaciones. En vista de todos estos puntos, las estructuras de datos funcionales se parecen algunas veces al oso que baila, de quien se dice, "lo maravilloso no es que el danza muy bien, sino de  que el danza de alguna manera!". En la practica, sin embargo, la situacion no es tan triste. Como podremos ver, es a menudo posible eleborar estructuras de datos funcionales que son asintoticamente tan eficientes como las mejores soluciones imperativas.</p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/metadata/859/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Tue, 09 Feb 2010 17:55:16 +0100" ><![CDATA[Estructuras de Datos Funcionales]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/metadata/855/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Tue, 09 Feb 2010 16:21:00 +0100" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/107/" class="object" subclass="blog" published="Tue, 09 Feb 2010 16:20:59 +0100" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="owner_uuid" published="Tue, 09 Feb 2010 16:20:59 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="container_uuid" published="Tue, 09 Feb 2010 16:20:59 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="title" published="Tue, 09 Feb 2010 16:20:59 +0100" ><![CDATA[Estructuras de Datos Funcionales vs. Imperativas]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="description" published="Tue, 09 Feb 2010 16:20:59 +0100" ><![CDATA[<p>En esta oportunidad quiero compartir una traduccion de una de los subtitulos del libro: Purely Functional Data Structure [Chris Okasaki], que me parecio muy buena.</p>
<p><strong>Estructuras de Datos Funcionales vs. Imperativas</strong></p>
<p>Los beneficios metodologicos de los lenguajes funcionales son bien conocidos, pero aun la mayoria de los programas son escritos en lenguajes imperativos como C. Esta aparente contradiccion es facilmente explicado por el hecho de que los lenguajes funcionales han sido historicamente mas lentos que sus mas tradicionales primos, pero esta brecha se esta reduciendo. Se han hecho impresionantes avances desde un amplio frente, desde tecnologias basicas de compiladores a analisis sofisticados y optimizaciones. Sin embargo, hay un aspecto de la programacion funcional que todo escritor de compiladores debe mitigar - el uso de&nbsp;estructuras de datos&nbsp;inapropiadas o inferiores.</p>
<p>Porque las estructuras de datos funcionales son mas dificultuosas para dise&ntilde;ar e implementar que las imperativas? Hay 2 problemas basicos. Primero, desde el punto de vista de dise&ntilde;o e implementacion de estructuras de datos eficientes, la estructura de la programacion funcional contra actualizaciones destructivas (ej. asignaciones) es una desventaja asombrosa, equivalente a confiscar los cuchillos de un chef master. Al igual que los cuchillos, las actualizaciones destructivas pueden ser da&ntilde;inas cuando son mal usadas, pero tremendamente efectivas cuando son usadas apropiadamente. Las estructuras de datos imperativas a menudo confian en la asignacion de una forma crucial, y por eso se encuentran diferentes soluciones para los programas funcionales.</p>
<p>La segunda dificultad es que se espera que las estructuras de datos funcionales sean mas flexibles que sus contrapartes imperativas. En particular, cuando actualizamos una estructura de datos imperativa, tipicamente aceptamos que la version antigua de la estructura de datos ya no estara disponible, pero cuando actualizamos una estructura de datos funcional, esperamos que la antigua y nueva version de la estructura de datos estara disponible para futuros procesamientos. Una estructura de datos que soporta multiples versiones es llamado <em>persistente [persistent]</em>, mientras que una estrutura de datos que permite solo una simple version en un tiempo es llamado <em>efimera [ephemeral]</em>. Los lenguajes de programacion funcional tienen la propiedad curiosa de que todas las estructuras de datos son auntomaticamente persistentes.&nbsp;<br />Las estructuras de datos imperativas son tipicamente efimeras, pero cuando una estructura de datos persistente es requerida, los programadores imperativos no se sorprenden si la estructura de datos persistente es mas complicada y talves incluso asintoticamente menos eficiente que una equivalente estructura de datos efimera.</p>
<p>Ademas, los teoricos han establecido limites inferiores sugeriendo que los lenguajes de programacion funcional podrian ser fundamentalmente menos eficientes que los lenguajes imperativos en algunas situaciones. En vista de todos estos puntos, las estructuras de datos funcionales se parecen algunas veces al oso que baila, de quien se dice, "lo maravilloso no es que el danza muy bien, sino de  que el danza de alguna manera!". En la practica, sin embargo, la situacion no es tan triste. Como podremos ver, es a menudo posible eleborar estructuras de datos funcionales que son asintoticamente tan eficientes como las mejores soluciones imperativas.</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/107/estructuras-de-datos-funcionales-vs-imperativas">Estructuras de Datos Funcionales vs. Imperativas</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				February 9, 2010				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/107/estructuras-de-datos-funcionales-vs-imperativas">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Estructuras+de+Datos+Funcionales">Estructuras de Datos Funcionales</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>En esta oportunidad quiero compartir una traduccion de una de los subtitulos del libro: Purely Functional Data Structure [Chris Okasaki], que me parecio muy buena.</p>
<p><strong>Estructuras de Datos Funcionales vs. Imperativas</strong></p>
<p>Los beneficios metodologicos de los lenguajes funcionales son bien conocidos, pero aun la mayoria de los programas son escritos en lenguajes imperativos como C. Esta aparente contradiccion es facilmente explicado por el hecho de que los lenguajes funcionales han sido historicamente mas lentos que sus mas tradicionales primos, pero esta brecha se esta reduciendo. Se han hecho impresionantes avances desde un amplio frente, desde tecnologias basicas de compiladores a analisis sofisticados y optimizaciones. Sin embargo, hay un aspecto de la programacion funcional que todo escritor de compiladores debe mitigar - el uso de&nbsp;estructuras de datos&nbsp;inapropiadas o inferiores.</p>
<p>Porque las estructuras de datos funcionales son mas dificultuosas para dise&ntilde;ar e implementar que las imperativas? Hay 2 problemas basicos. Primero, desde el punto de vista de dise&ntilde;o e implementacion de estructuras de datos eficientes, la estructura de la programacion funcional contra actualizaciones destructivas (ej. asignaciones) es una desventaja asombrosa, equivalente a confiscar los cuchillos de un chef master. Al igual que los cuchillos, las actualizaciones destructivas pueden ser da&ntilde;inas cuando son mal usadas, pero tremendamente efectivas cuando son usadas apropiadamente. Las estructuras de datos imperativas a menudo confian en la asignacion de una forma crucial, y por eso se encuentran diferentes soluciones para los programas funcionales.</p>
<p>La segunda dificultad es que se espera que las estructuras de datos funcionales sean mas flexibles que sus contrapartes imperativas. En particular, cuando actualizamos una estructura de datos imperativa, tipicamente aceptamos que la version antigua de la estructura de datos ya no estara disponible, pero cuando actualizamos una estructura de datos funcional, esperamos que la antigua y nueva version de la estructura de datos estara disponible para futuros procesamientos. Una estructura de datos que soporta multiples versiones es llamado <em>persistente [persistent]</em>, mientras que una estrutura de datos que permite solo una simple version en un tiempo es llamado <em>efimera [ephemeral]</em>. Los lenguajes de programacion funcional tienen la propiedad curiosa de que todas las estructuras de datos son auntomaticamente persistentes.&nbsp;<br />Las estructuras de datos imperativas son tipicamente efimeras, pero cuando una estructura de datos persistente es requerida, los programadores imperativos no se sorprenden si la estructura de datos persistente es mas complicada y talves incluso asintoticamente menos eficiente que una equivalente estructura de datos efimera.</p>
<p>Ademas, los teoricos han establecido limites inferiores sugeriendo que los lenguajes de programacion funcional podrian ser fundamentalmente menos eficientes que los lenguajes imperativos en algunas situaciones. En vista de todos estos puntos, las estructuras de datos funcionales se parecen algunas veces al oso que baila, de quien se dice, "lo maravilloso no es que el danza muy bien, sino de  que el danza de alguna manera!". En la practica, sin embargo, la situacion no es tan triste. Como podremos ver, es a menudo posible eleborar estructuras de datos funcionales que son asintoticamente tan eficientes como las mejores soluciones imperativas.</p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/metadata/859/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Tue, 09 Feb 2010 17:55:16 +0100" ><![CDATA[Estructuras de Datos Funcionales]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/107/metadata/855/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/107/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Tue, 09 Feb 2010 16:21:00 +0100" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/104/" class="object" subclass="blog" published="Wed, 18 Nov 2009 00:08:30 +0100" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="owner_uuid" published="Wed, 18 Nov 2009 00:08:30 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/2/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="container_uuid" published="Wed, 18 Nov 2009 00:08:30 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/2/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="title" published="Wed, 18 Nov 2009 00:08:30 +0100" ><![CDATA[hs-plugins!!! por fin encuentro el bueno]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="description" published="Wed, 18 Nov 2009 00:08:30 +0100" ><![CDATA[<p>Eso de que pongan en diferentes lados este codigo pero en cada sitio versiones diferentes es grrrraaave!!</p>
<p>pero por fin encontre el bueno:</p>
<p>http://code.haskell.org/~dons/code/hs-plugins/</p>
<p>http://hackage.haskell.org/package/plugins</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/darkben/read/104/hsplugins-por-fin-encuentro-el-bueno">hs-plugins!!! por fin encuentro el bueno</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/darkben"><h3>Darkben</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/darkben">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/darkben/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/darkben/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/darkben">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/darkben">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/darkben">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/darkben" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240377997&username=darkben&size=tiny" border="0"  title="Darkben"  /></a>
</div>

	    </div>
			<p class="strapline">
				November 18, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/darkben">Darkben</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/darkben/read/104/hsplugins-por-fin-encuentro-el-bueno">Comentarios (2)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/hs-plugins">hs-plugins</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Eso de que pongan en diferentes lados este codigo pero en cada sitio versiones diferentes es grrrraaave!!</p>
<p>pero por fin encontre el bueno:</p>
<p><a href="http://code.haskell.org/~dons/code/hs-plugins/" style="text-decoration:underline;">http:/<wbr />/<wbr />code.haskell.org/<wbr />~dons/<wbr />code/<wbr />hs-plugins/<wbr /></a></p>
<p><a href="http://hackage.haskell.org/package/plugins" style="text-decoration:underline;">http:/<wbr />/<wbr />hackage.haskell.org/<wbr />package/<wbr />plugins</a></p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p><span style="font-family: 'Trebuchet MS', 'Lucida Grande', Arial, sans-serif; line-height: 20px;"></p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">que tal benjamin,</p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">&nbsp;hace tiempo intente hacer correr algun ejemplo usando la libreria, y no obtube ningun buen resultado. Porfa avisame si logras correr algun ejemplo.</p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">&nbsp;Por otro lado, me dijieron que esta libreria ya no tiene soporte y me recomendaron usar en ves de este otra libreria de ghc llamada HInt (haskell interprer). Hint, si funciona, solo que no parece tener la misma estructura que hs-plugins (puede que este equivocado en esa afirmacion, porque lo vi a grandes rasgos).</p>
<p></span></p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 286 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/darkben"><h3>Darkben</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/darkben">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/darkben/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/darkben/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/darkben">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/darkben">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/darkben">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/darkben" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240377997&username=darkben&size=small" border="0"  title="Darkben"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>si, la libreria ya no lo estan manteniendo, el ultimo cambio que hicieron al parecer fue en el .cabal para la instalacion.</p>
<p>Bueno, yo solo lo necesito para la instalacion de HaskellDB por que depende de esta libreria no lo vi mas.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/darkben">Darkben</a> hace 283 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/annotation/22/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 25 Nov 2009 04:02:52 +0100" ><![CDATA[<p><span style="font-family: 'Trebuchet MS', 'Lucida Grande', Arial, sans-serif; line-height: 20px;">
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">que tal benjamin,</p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">&nbsp;hace tiempo intente hacer correr algun ejemplo usando la libreria, y no obtube ningun buen resultado. Porfa avisame si logras correr algun ejemplo.</p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">&nbsp;Por otro lado, me dijieron que esta libreria ya no tiene soporte y me recomendaron usar en ves de este otra libreria de ghc llamada HInt (haskell interprer). Hint, si funciona, solo que no parece tener la misma estructura que hs-plugins (puede que este equivocado en esa afirmacion, porque lo vi a grandes rasgos).</p>
</span></p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/annotation/23/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/2/" published="Fri, 27 Nov 2009 15:07:52 +0100" ><![CDATA[<p>si, la libreria ya no lo estan manteniendo, el ultimo cambio que hicieron al parecer fue en el .cabal para la instalacion.</p>
<p>Bueno, yo solo lo necesito para la instalacion de HaskellDB por que depende de esta libreria no lo vi mas.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/metadata/835/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/2/" published="Wed, 18 Nov 2009 00:08:31 +0100" ><![CDATA[hs-plugins]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/metadata/836/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/2/" published="Wed, 18 Nov 2009 00:08:31 +0100" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/104/" class="object" subclass="blog" published="Wed, 18 Nov 2009 00:08:30 +0100" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="owner_uuid" published="Wed, 18 Nov 2009 00:08:30 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/2/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="container_uuid" published="Wed, 18 Nov 2009 00:08:30 +0100" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/2/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="title" published="Wed, 18 Nov 2009 00:08:30 +0100" ><![CDATA[hs-plugins!!! por fin encuentro el bueno]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="description" published="Wed, 18 Nov 2009 00:08:30 +0100" ><![CDATA[<p>Eso de que pongan en diferentes lados este codigo pero en cada sitio versiones diferentes es grrrraaave!!</p>
<p>pero por fin encontre el bueno:</p>
<p>http://code.haskell.org/~dons/code/hs-plugins/</p>
<p>http://hackage.haskell.org/package/plugins</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/darkben/read/104/hsplugins-por-fin-encuentro-el-bueno">hs-plugins!!! por fin encuentro el bueno</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/darkben"><h3>Darkben</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/darkben">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/darkben/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/darkben/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/darkben">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/darkben">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/darkben">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/darkben" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240377997&username=darkben&size=tiny" border="0"  title="Darkben"  /></a>
</div>

	    </div>
			<p class="strapline">
				November 18, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/darkben">Darkben</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/darkben/read/104/hsplugins-por-fin-encuentro-el-bueno">Comentarios (2)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/hs-plugins">hs-plugins</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Eso de que pongan en diferentes lados este codigo pero en cada sitio versiones diferentes es grrrraaave!!</p>
<p>pero por fin encontre el bueno:</p>
<p><a href="http://code.haskell.org/~dons/code/hs-plugins/" style="text-decoration:underline;">http:/<wbr />/<wbr />code.haskell.org/<wbr />~dons/<wbr />code/<wbr />hs-plugins/<wbr /></a></p>
<p><a href="http://hackage.haskell.org/package/plugins" style="text-decoration:underline;">http:/<wbr />/<wbr />hackage.haskell.org/<wbr />package/<wbr />plugins</a></p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p><span style="font-family: 'Trebuchet MS', 'Lucida Grande', Arial, sans-serif; line-height: 20px;"></p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">que tal benjamin,</p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">&nbsp;hace tiempo intente hacer correr algun ejemplo usando la libreria, y no obtube ningun buen resultado. Porfa avisame si logras correr algun ejemplo.</p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">&nbsp;Por otro lado, me dijieron que esta libreria ya no tiene soporte y me recomendaron usar en ves de este otra libreria de ghc llamada HInt (haskell interprer). Hint, si funciona, solo que no parece tener la misma estructura que hs-plugins (puede que este equivocado en esa afirmacion, porque lo vi a grandes rasgos).</p>
<p></span></p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 286 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/darkben"><h3>Darkben</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/darkben">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/darkben/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/darkben/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/darkben">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/darkben">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/darkben">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/darkben" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240377997&username=darkben&size=small" border="0"  title="Darkben"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>si, la libreria ya no lo estan manteniendo, el ultimo cambio que hicieron al parecer fue en el .cabal para la instalacion.</p>
<p>Bueno, yo solo lo necesito para la instalacion de HaskellDB por que depende de esta libreria no lo vi mas.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/darkben">Darkben</a> hace 283 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/annotation/22/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 25 Nov 2009 04:02:52 +0100" ><![CDATA[<p><span style="font-family: 'Trebuchet MS', 'Lucida Grande', Arial, sans-serif; line-height: 20px;">
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">que tal benjamin,</p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">&nbsp;hace tiempo intente hacer correr algun ejemplo usando la libreria, y no obtube ningun buen resultado. Porfa avisame si logras correr algun ejemplo.</p>
<p style="color:#555555; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px;">&nbsp;Por otro lado, me dijieron que esta libreria ya no tiene soporte y me recomendaron usar en ves de este otra libreria de ghc llamada HInt (haskell interprer). Hint, si funciona, solo que no parece tener la misma estructura que hs-plugins (puede que este equivocado en esa afirmacion, porque lo vi a grandes rasgos).</p>
</span></p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/annotation/23/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/2/" published="Fri, 27 Nov 2009 15:07:52 +0100" ><![CDATA[<p>si, la libreria ya no lo estan manteniendo, el ultimo cambio que hicieron al parecer fue en el .cabal para la instalacion.</p>
<p>Bueno, yo solo lo necesito para la instalacion de HaskellDB por que depende de esta libreria no lo vi mas.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/metadata/835/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/2/" published="Wed, 18 Nov 2009 00:08:31 +0100" ><![CDATA[hs-plugins]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/104/metadata/836/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/104/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/2/" published="Wed, 18 Nov 2009 00:08:31 +0100" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/96/" class="object" subclass="blog" published="Thu, 06 Aug 2009 02:27:37 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="owner_uuid" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="container_uuid" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="title" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[Setters and Getters en Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="description" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[<p>&nbsp;</p>
<p><strong>Nota</strong>.- Para su mejor comprencion he hecho varios cambios aqui, uno de ellos es el nombre del contructor de datos, de Persona a Per.</p>
<p>Ahora, Como definimos los setters y getters de una estructura de datos Persona?</p>
<p>Responderemos a esta pregunta, en el resto de este blog, asi nuestra estructura de datos es Persona con los datos de ci, nombre, apellido y edad.</p>
<div style="color:#000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font: normal normal normal 13px/19px 'Lucida Grande', 'Lucida Sans Unicode', Tahoma, Verdana, sans-serif; background-position: initial initial; background-repeat: initial initial; padding: 0.6em; margin: 0px;">
<blockquote>
<p>data Persona = Per CI&nbsp;Name&nbsp;LastName Edad<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;deriving Show<br />type CI &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Int<br />type Name &nbsp; &nbsp; &nbsp; = String<br />type LastName = String<br />type Edad &nbsp; &nbsp; &nbsp; &nbsp;= Int</p>
</blockquote>
<p>Esto define una funcion constructora de datos de tipo:</p>
<blockquote>
<p>Per ::CI -&gt; Name -&gt; LastName -&gt; Edad -&gt; Persona</p>
</blockquote>
<p>Veamos algunos ejemplos:</p>
<blockquote>
<p>p1 :: Persona<br />p1 = Per 1212&nbsp;"Juan" "Block" 35</p>
<p>p2 :: Persona<br />p2 = Persona 2323 "Pedro" "Ramos" 25</p>
</blockquote>
<p>Ahora definamos algunas funciones set y get para Persona</p>
<blockquote>
<p>setCI :: Persona -&gt; CI -&gt; Persona<br />setCI (Persona ci nm ap ed) ci' = Per ci' nm ap ed</p>
</blockquote>
<blockquote>
<p>setNombre :: Persona -&gt; Name -&gt; Persona<br />setNombre (Persona ci nm ap ed) nm' = Per ci nm' ap ed</p>
<p>setApellido :: Persona -&gt; LastName -&gt; Persona<br />setApellido (Persona ci nm ap ed) ap' = Per ci nm ap' ed</p>
<p>setEdad :: Persona -&gt; Edad -&gt; Persona<br />setEdad (Persona ci nm ap ed) ed' = Per ci nm ap ed'</p>
</blockquote>
<blockquote>
<p>getCI :: Persona -&gt; CI<br />getCI (Persona ci _ _ _) = ci</p>
<p>getNombre :: Persona -&gt; Name<br />getNombre (Persona _ nm _ _) = nm</p>
<p>getApellido :: Persona -&gt; LastName<br />getApellido (Persona _ _ ap _) = ap</p>
<p>getEdad :: Persona -&gt; Edad<br />getEdad (Persona _ _ _ ed) = ed</p>
</blockquote>
<p>Si hacemos algunas pruebas obtenemos:</p>
<blockquote>
<p>gt;*Main&gt; getCI p1</p>
</blockquote>
<p>nos retornaria el CI de 'Juan', tambien podemos obtener nombre, apellido o edad.</p>
<p>Para setear un valor, podemos hacer</p>
<blockquote>
<p>*Main&gt; p1 {nombre = "juanes"}<br />Persona {ci = 1212, nombre = "juanes", apellido = "Block", edad = 35}</p>
</blockquote>
<p>Y listo, mision cumplida, aunque un poco tedioso.&nbsp;<br />Bueno, esto no termina aqui, resulta que Haskell provee una forma diferente de definir los datatypes, esto es nombrando los elementos de cada constructor de datos. Llamado tambien records de Haskell.</p>
<p>Veamos como nos ayuda esto, en nuestra definicion de setters y getters, y como cambia a lo anterior ya hecho.</p>
<blockquote>
<p>data Persona = Per { ci &nbsp; &nbsp; &nbsp; &nbsp;:: CI<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , nombre :: Name<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , apellido :: LastName<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , edad &nbsp; &nbsp; :: Edad<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } deriving Show<br />type CI &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Int<br />type Name &nbsp; &nbsp; &nbsp; = String<br />type LastName = String<br />type Edad &nbsp; &nbsp; &nbsp; &nbsp;= Int</p>
</blockquote>
<p>Bueno, eso es todo lo que tenemos que hacer, hagamos algunas pruebas para ver algo de teoria.</p>
<blockquote>
<p>p3 = Per 2525 "Teo" "Flores" 43 &nbsp;-- creamos un instancia<br />* Main&gt; ci p3<br />2525<br />* Main&gt; p3{nombre = "Maria"}<br />Persona {ci = 2525, nombre = "Maria", apellido = "Flores", edad = 43}</p>
</blockquote>
<p>Como veras, hicimos las operaciones de set y get.</p>
<p>Algo de teoria, el nombramiento de campos en los datatypes no afecta al anterior version, por ejemplo el tipo contructor de datos es el mismo. Pero hay funcionalidades que se aumentan. Entre ellos tenemos la seleccion de campos usando labels, construccion usando labels y actualizacion de campos usando labels.</p>
<p>La seleccion de campos usando labels, es practicamente la operacion seter de un objeto. Y lo que Haskell hace es definir una funcion con el nombre del label, el cual esta disponible para su uso. Ejemplo "ci p3".</p>
<p>Tambien podemos contruir instancias usando labels (p4 = Per {edad=12, ci=3434, apellido="Perez", nombre="Pedro"} ), y no solo de la forma comun (p4 = Per 3434 12 "Pedro"&nbsp;"Perez"). Intensionalmente he cambiado las posiciones de los labels, pues esto no afecta. Se debe cuidar de que ningun label se repita mas de una ves, pero si no especificamos algun label, este deberia inicializar como indefinido o infito (GHC lo muestra como un warning).</p>
<p>Para la actualizacion de campos usando labels, se tiene una sintaxis: instancia_obj {label=value, ...}, asi como en el ejemplo p3{ci=3454}. Otra ves, no se debe mencionar mas de una ves una label, y los labels deben pertenecer al tipo contructor.</p>
<p>Al actualizar un valor de la instancia, se genera una nueva instancia modificando asi en la nueva instancia los valores enviados. Es una caracteristica de Persistencia de Haskell. Veamos un ejemplo:</p>
<blockquote>
<p>*Main&gt; p1 {edad = 0}<br />Persona {ci =&nbsp;1212, nombre = "Juan", apellido = "Block", edad = 0}<br />*Main&gt; p1<br />Persona {ci =&nbsp;1212, nombre = "Juan", apellido = "Block", edad = 35}</p>
</blockquote>
<p>Tambien podemos mesclar los distintos contructores de datos con esta sintxis o sin ella. Y respecto a los nombres de los labels, podemos repetirlas entre las funciones contructoras de datos, siempre y cuando se tenga un tipo consistente, pero no podemos repetirnas entre los datatypes, porque generaria una incosistencia de tipos. Veamos un ejemplo sacado del reporte de Haskell 98:</p>
<blockquote>
<p>data S = S1 {x :: Int}<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| S2 {x :: Int} &nbsp; -- ejemplo bueno<br /><br />data T = T1 {y :: Int}<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| T2 {y :: Bool} &nbsp;-- ejemplo malo, tipo inconsistente</p>
</blockquote>
<p>En conclusion, esta forma de creacion de datatypes, a&ntilde;ade funcionalidad y sintaxis extra para manipular los elementos del datatype.</p>
<p>Algo interesante seria averiguar como definir mucha mas similitud de funcionalidad a OOP. Me refiero a definir solo funciones set o get para algunos elementos, o declarar elementos como publicos, protegidos o privados.</p>
<p>Hay otras extenciones de GHC que nos facilitan la manipulacion de records en Haskell. Pero los que hemos visto aqui pertenece al Haskell 98.</p>
</div>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/96/setters-and-getters-en-haskell">Setters and Getters en Haskell</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				August 6, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/96/setters-and-getters-en-haskell">Comentarios (2)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/get">get</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/set">set</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/label+datatype">label datatype</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/records+en+Haskell">records en Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/setter">setter</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/getter">getter</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>&nbsp;</p>
<p><strong>Nota</strong>.- Para su mejor comprencion he hecho varios cambios aqui, uno de ellos es el nombre del contructor de datos, de Persona a Per.</p>
<p>Ahora, Como definimos los setters y getters de una estructura de datos Persona?</p>
<p>Responderemos a esta pregunta, en el resto de este blog, asi nuestra estructura de datos es Persona con los datos de ci, nombre, apellido y edad.</p>
<div style="color:#000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font: normal normal normal 13px/19px 'Lucida Grande', 'Lucida Sans Unicode', Tahoma, Verdana, sans-serif; background-position: initial initial; background-repeat: initial initial; padding: 0.6em; margin: 0px;">
<blockquote>
<p>data Persona = Per CI&nbsp;Name&nbsp;LastName Edad<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;deriving Show<br />type CI &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Int<br />type Name &nbsp; &nbsp; &nbsp; = String<br />type LastName = String<br />type Edad &nbsp; &nbsp; &nbsp; &nbsp;= Int</p>
</blockquote>
<p>Esto define una funcion constructora de datos de tipo:</p>
<blockquote>
<p>Per ::CI -&gt; Name -&gt; LastName -&gt; Edad -&gt; Persona</p>
</blockquote>
<p>Veamos algunos ejemplos:</p>
<blockquote>
<p>p1 :: Persona<br />p1 = Per 1212&nbsp;"Juan" "Block" 35</p>
<p>p2 :: Persona<br />p2 = Persona 2323 "Pedro" "Ramos" 25</p>
</blockquote>
<p>Ahora definamos algunas funciones set y get para Persona</p>
<blockquote>
<p>setCI :: Persona -&gt; CI -&gt; Persona<br />setCI (Persona ci nm ap ed) ci' = Per ci' nm ap ed</p>
</blockquote>
<blockquote>
<p>setNombre :: Persona -&gt; Name -&gt; Persona<br />setNombre (Persona ci nm ap ed) nm' = Per ci nm' ap ed</p>
<p>setApellido :: Persona -&gt; LastName -&gt; Persona<br />setApellido (Persona ci nm ap ed) ap' = Per ci nm ap' ed</p>
<p>setEdad :: Persona -&gt; Edad -&gt; Persona<br />setEdad (Persona ci nm ap ed) ed' = Per ci nm ap ed'</p>
</blockquote>
<blockquote>
<p>getCI :: Persona -&gt; CI<br />getCI (Persona ci _ _ _) = ci</p>
<p>getNombre :: Persona -&gt; Name<br />getNombre (Persona _ nm _ _) = nm</p>
<p>getApellido :: Persona -&gt; LastName<br />getApellido (Persona _ _ ap _) = ap</p>
<p>getEdad :: Persona -&gt; Edad<br />getEdad (Persona _ _ _ ed) = ed</p>
</blockquote>
<p>Si hacemos algunas pruebas obtenemos:</p>
<blockquote>
<p>gt;*Main&gt; getCI p1</p>
</blockquote>
<p>nos retornaria el CI de 'Juan', tambien podemos obtener nombre, apellido o edad.</p>
<p>Para setear un valor, podemos hacer</p>
<blockquote>
<p>*Main&gt; p1 {nombre = "juanes"}<br />Persona {ci = 1212, nombre = "juanes", apellido = "Block", edad = 35}</p>
</blockquote>
<p>Y listo, mision cumplida, aunque un poco tedioso.&nbsp;<br />Bueno, esto no termina aqui, resulta que Haskell provee una forma diferente de definir los datatypes, esto es nombrando los elementos de cada constructor de datos. Llamado tambien records de Haskell.</p>
<p>Veamos como nos ayuda esto, en nuestra definicion de setters y getters, y como cambia a lo anterior ya hecho.</p>
<blockquote>
<p>data Persona = Per { ci &nbsp; &nbsp; &nbsp; &nbsp;:: CI<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , nombre :: Name<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , apellido :: LastName<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , edad &nbsp; &nbsp; :: Edad<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } deriving Show<br />type CI &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Int<br />type Name &nbsp; &nbsp; &nbsp; = String<br />type LastName = String<br />type Edad &nbsp; &nbsp; &nbsp; &nbsp;= Int</p>
</blockquote>
<p>Bueno, eso es todo lo que tenemos que hacer, hagamos algunas pruebas para ver algo de teoria.</p>
<blockquote>
<p>p3 = Per 2525 "Teo" "Flores" 43 &nbsp;-- creamos un instancia<br />* Main&gt; ci p3<br />2525<br />* Main&gt; p3{nombre = "Maria"}<br />Persona {ci = 2525, nombre = "Maria", apellido = "Flores", edad = 43}</p>
</blockquote>
<p>Como veras, hicimos las operaciones de set y get.</p>
<p>Algo de teoria, el nombramiento de campos en los datatypes no afecta al anterior version, por ejemplo el tipo contructor de datos es el mismo. Pero hay funcionalidades que se aumentan. Entre ellos tenemos la seleccion de campos usando labels, construccion usando labels y actualizacion de campos usando labels.</p>
<p>La seleccion de campos usando labels, es practicamente la operacion seter de un objeto. Y lo que Haskell hace es definir una funcion con el nombre del label, el cual esta disponible para su uso. Ejemplo "ci p3".</p>
<p>Tambien podemos contruir instancias usando labels (p4 = Per {edad=12, ci=3434, apellido="Perez", nombre="Pedro"} ), y no solo de la forma comun (p4 = Per 3434 12 "Pedro"&nbsp;"Perez"). Intensionalmente he cambiado las posiciones de los labels, pues esto no afecta. Se debe cuidar de que ningun label se repita mas de una ves, pero si no especificamos algun label, este deberia inicializar como indefinido o infito (GHC lo muestra como un warning).</p>
<p>Para la actualizacion de campos usando labels, se tiene una sintaxis: instancia_obj {label=value, ...}, asi como en el ejemplo p3{ci=3454}. Otra ves, no se debe mencionar mas de una ves una label, y los labels deben pertenecer al tipo contructor.</p>
<p>Al actualizar un valor de la instancia, se genera una nueva instancia modificando asi en la nueva instancia los valores enviados. Es una caracteristica de Persistencia de Haskell. Veamos un ejemplo:</p>
<blockquote>
<p>*Main&gt; p1 {edad = 0}<br />Persona {ci =&nbsp;1212, nombre = "Juan", apellido = "Block", edad = 0}<br />*Main&gt; p1<br />Persona {ci =&nbsp;1212, nombre = "Juan", apellido = "Block", edad = 35}</p>
</blockquote>
<p>Tambien podemos mesclar los distintos contructores de datos con esta sintxis o sin ella. Y respecto a los nombres de los labels, podemos repetirlas entre las funciones contructoras de datos, siempre y cuando se tenga un tipo consistente, pero no podemos repetirnas entre los datatypes, porque generaria una incosistencia de tipos. Veamos un ejemplo sacado del reporte de Haskell 98:</p>
<blockquote>
<p>data S = S1 {x :: Int}<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| S2 {x :: Int} &nbsp; -- ejemplo bueno</p>
<p>data T = T1 {y :: Int}<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| T2 {y :: Bool} &nbsp;-- ejemplo malo, tipo inconsistente</p>
</blockquote>
<p>En conclusion, esta forma de creacion de datatypes, a&ntilde;ade funcionalidad y sintaxis extra para manipular los elementos del datatype.</p>
<p>Algo interesante seria averiguar como definir mucha mas similitud de funcionalidad a OOP. Me refiero a definir solo funciones set o get para algunos elementos, o declarar elementos como publicos, protegidos o privados.</p>
<p>Hay otras extenciones de GHC que nos facilitan la manipulacion de records en Haskell. Pero los que hemos visto aqui pertenece al Haskell 98.</p>
</div>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota"><h3>Juan Jose Olivera</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/jotajota/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/jotajota/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/jotajota">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/jotajota">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/jotajota">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Juan Jose Olivera"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Osea, se copia todos los valores de la primera instancia + el valor pasado , y se crea una nueva instancia del data?</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Juan Jose Olivera</a> hace 392 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Si, eso es lo que hace.</p>
<p>Lo podemos ver en el ejemplo, " juan {edad = 0}" genera una nueva instancia con su valor attributo edad cambiado. pero cuando volvemos a mostrar "juan" (en la segunda corrida) esta intacto.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 390 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/annotation/18/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/7/" published="Tue, 11 Aug 2009 00:51:52 +0200" ><![CDATA[<p>Osea, se copia todos los valores de la primera instancia + el valor pasado , y se crea una nueva instancia del data?</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/annotation/21/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 12 Aug 2009 20:42:25 +0200" ><![CDATA[<p>Si, eso es lo que hace.</p>
<p>Lo podemos ver en el ejemplo, " juan {edad = 0}" genera una nueva instancia con su valor attributo edad cambiado. pero cuando volvemos a mostrar "juan" (en la segunda corrida) esta intacto.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/941/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[get]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/940/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[set]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/939/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/938/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[label datatype]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/937/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[records en Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/761/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[on]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/936/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[setter]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/935/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[getter]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/96/" class="object" subclass="blog" published="Thu, 06 Aug 2009 02:27:37 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="owner_uuid" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="container_uuid" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="title" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[Setters and Getters en Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="description" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[<p>&nbsp;</p>
<p><strong>Nota</strong>.- Para su mejor comprencion he hecho varios cambios aqui, uno de ellos es el nombre del contructor de datos, de Persona a Per.</p>
<p>Ahora, Como definimos los setters y getters de una estructura de datos Persona?</p>
<p>Responderemos a esta pregunta, en el resto de este blog, asi nuestra estructura de datos es Persona con los datos de ci, nombre, apellido y edad.</p>
<div style="color:#000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font: normal normal normal 13px/19px 'Lucida Grande', 'Lucida Sans Unicode', Tahoma, Verdana, sans-serif; background-position: initial initial; background-repeat: initial initial; padding: 0.6em; margin: 0px;">
<blockquote>
<p>data Persona = Per CI&nbsp;Name&nbsp;LastName Edad<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;deriving Show<br />type CI &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Int<br />type Name &nbsp; &nbsp; &nbsp; = String<br />type LastName = String<br />type Edad &nbsp; &nbsp; &nbsp; &nbsp;= Int</p>
</blockquote>
<p>Esto define una funcion constructora de datos de tipo:</p>
<blockquote>
<p>Per ::CI -&gt; Name -&gt; LastName -&gt; Edad -&gt; Persona</p>
</blockquote>
<p>Veamos algunos ejemplos:</p>
<blockquote>
<p>p1 :: Persona<br />p1 = Per 1212&nbsp;"Juan" "Block" 35</p>
<p>p2 :: Persona<br />p2 = Persona 2323 "Pedro" "Ramos" 25</p>
</blockquote>
<p>Ahora definamos algunas funciones set y get para Persona</p>
<blockquote>
<p>setCI :: Persona -&gt; CI -&gt; Persona<br />setCI (Persona ci nm ap ed) ci' = Per ci' nm ap ed</p>
</blockquote>
<blockquote>
<p>setNombre :: Persona -&gt; Name -&gt; Persona<br />setNombre (Persona ci nm ap ed) nm' = Per ci nm' ap ed</p>
<p>setApellido :: Persona -&gt; LastName -&gt; Persona<br />setApellido (Persona ci nm ap ed) ap' = Per ci nm ap' ed</p>
<p>setEdad :: Persona -&gt; Edad -&gt; Persona<br />setEdad (Persona ci nm ap ed) ed' = Per ci nm ap ed'</p>
</blockquote>
<blockquote>
<p>getCI :: Persona -&gt; CI<br />getCI (Persona ci _ _ _) = ci</p>
<p>getNombre :: Persona -&gt; Name<br />getNombre (Persona _ nm _ _) = nm</p>
<p>getApellido :: Persona -&gt; LastName<br />getApellido (Persona _ _ ap _) = ap</p>
<p>getEdad :: Persona -&gt; Edad<br />getEdad (Persona _ _ _ ed) = ed</p>
</blockquote>
<p>Si hacemos algunas pruebas obtenemos:</p>
<blockquote>
<p>gt;*Main&gt; getCI p1</p>
</blockquote>
<p>nos retornaria el CI de 'Juan', tambien podemos obtener nombre, apellido o edad.</p>
<p>Para setear un valor, podemos hacer</p>
<blockquote>
<p>*Main&gt; p1 {nombre = "juanes"}<br />Persona {ci = 1212, nombre = "juanes", apellido = "Block", edad = 35}</p>
</blockquote>
<p>Y listo, mision cumplida, aunque un poco tedioso.&nbsp;<br />Bueno, esto no termina aqui, resulta que Haskell provee una forma diferente de definir los datatypes, esto es nombrando los elementos de cada constructor de datos. Llamado tambien records de Haskell.</p>
<p>Veamos como nos ayuda esto, en nuestra definicion de setters y getters, y como cambia a lo anterior ya hecho.</p>
<blockquote>
<p>data Persona = Per { ci &nbsp; &nbsp; &nbsp; &nbsp;:: CI<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , nombre :: Name<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , apellido :: LastName<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , edad &nbsp; &nbsp; :: Edad<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } deriving Show<br />type CI &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Int<br />type Name &nbsp; &nbsp; &nbsp; = String<br />type LastName = String<br />type Edad &nbsp; &nbsp; &nbsp; &nbsp;= Int</p>
</blockquote>
<p>Bueno, eso es todo lo que tenemos que hacer, hagamos algunas pruebas para ver algo de teoria.</p>
<blockquote>
<p>p3 = Per 2525 "Teo" "Flores" 43 &nbsp;-- creamos un instancia<br />* Main&gt; ci p3<br />2525<br />* Main&gt; p3{nombre = "Maria"}<br />Persona {ci = 2525, nombre = "Maria", apellido = "Flores", edad = 43}</p>
</blockquote>
<p>Como veras, hicimos las operaciones de set y get.</p>
<p>Algo de teoria, el nombramiento de campos en los datatypes no afecta al anterior version, por ejemplo el tipo contructor de datos es el mismo. Pero hay funcionalidades que se aumentan. Entre ellos tenemos la seleccion de campos usando labels, construccion usando labels y actualizacion de campos usando labels.</p>
<p>La seleccion de campos usando labels, es practicamente la operacion seter de un objeto. Y lo que Haskell hace es definir una funcion con el nombre del label, el cual esta disponible para su uso. Ejemplo "ci p3".</p>
<p>Tambien podemos contruir instancias usando labels (p4 = Per {edad=12, ci=3434, apellido="Perez", nombre="Pedro"} ), y no solo de la forma comun (p4 = Per 3434 12 "Pedro"&nbsp;"Perez"). Intensionalmente he cambiado las posiciones de los labels, pues esto no afecta. Se debe cuidar de que ningun label se repita mas de una ves, pero si no especificamos algun label, este deberia inicializar como indefinido o infito (GHC lo muestra como un warning).</p>
<p>Para la actualizacion de campos usando labels, se tiene una sintaxis: instancia_obj {label=value, ...}, asi como en el ejemplo p3{ci=3454}. Otra ves, no se debe mencionar mas de una ves una label, y los labels deben pertenecer al tipo contructor.</p>
<p>Al actualizar un valor de la instancia, se genera una nueva instancia modificando asi en la nueva instancia los valores enviados. Es una caracteristica de Persistencia de Haskell. Veamos un ejemplo:</p>
<blockquote>
<p>*Main&gt; p1 {edad = 0}<br />Persona {ci =&nbsp;1212, nombre = "Juan", apellido = "Block", edad = 0}<br />*Main&gt; p1<br />Persona {ci =&nbsp;1212, nombre = "Juan", apellido = "Block", edad = 35}</p>
</blockquote>
<p>Tambien podemos mesclar los distintos contructores de datos con esta sintxis o sin ella. Y respecto a los nombres de los labels, podemos repetirlas entre las funciones contructoras de datos, siempre y cuando se tenga un tipo consistente, pero no podemos repetirnas entre los datatypes, porque generaria una incosistencia de tipos. Veamos un ejemplo sacado del reporte de Haskell 98:</p>
<blockquote>
<p>data S = S1 {x :: Int}<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| S2 {x :: Int} &nbsp; -- ejemplo bueno<br /><br />data T = T1 {y :: Int}<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| T2 {y :: Bool} &nbsp;-- ejemplo malo, tipo inconsistente</p>
</blockquote>
<p>En conclusion, esta forma de creacion de datatypes, a&ntilde;ade funcionalidad y sintaxis extra para manipular los elementos del datatype.</p>
<p>Algo interesante seria averiguar como definir mucha mas similitud de funcionalidad a OOP. Me refiero a definir solo funciones set o get para algunos elementos, o declarar elementos como publicos, protegidos o privados.</p>
<p>Hay otras extenciones de GHC que nos facilitan la manipulacion de records en Haskell. Pero los que hemos visto aqui pertenece al Haskell 98.</p>
</div>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/96/setters-and-getters-en-haskell">Setters and Getters en Haskell</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				August 6, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/96/setters-and-getters-en-haskell">Comentarios (2)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/get">get</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/set">set</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/label+datatype">label datatype</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/records+en+Haskell">records en Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/setter">setter</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/getter">getter</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>&nbsp;</p>
<p><strong>Nota</strong>.- Para su mejor comprencion he hecho varios cambios aqui, uno de ellos es el nombre del contructor de datos, de Persona a Per.</p>
<p>Ahora, Como definimos los setters y getters de una estructura de datos Persona?</p>
<p>Responderemos a esta pregunta, en el resto de este blog, asi nuestra estructura de datos es Persona con los datos de ci, nombre, apellido y edad.</p>
<div style="color:#000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font: normal normal normal 13px/19px 'Lucida Grande', 'Lucida Sans Unicode', Tahoma, Verdana, sans-serif; background-position: initial initial; background-repeat: initial initial; padding: 0.6em; margin: 0px;">
<blockquote>
<p>data Persona = Per CI&nbsp;Name&nbsp;LastName Edad<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;deriving Show<br />type CI &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Int<br />type Name &nbsp; &nbsp; &nbsp; = String<br />type LastName = String<br />type Edad &nbsp; &nbsp; &nbsp; &nbsp;= Int</p>
</blockquote>
<p>Esto define una funcion constructora de datos de tipo:</p>
<blockquote>
<p>Per ::CI -&gt; Name -&gt; LastName -&gt; Edad -&gt; Persona</p>
</blockquote>
<p>Veamos algunos ejemplos:</p>
<blockquote>
<p>p1 :: Persona<br />p1 = Per 1212&nbsp;"Juan" "Block" 35</p>
<p>p2 :: Persona<br />p2 = Persona 2323 "Pedro" "Ramos" 25</p>
</blockquote>
<p>Ahora definamos algunas funciones set y get para Persona</p>
<blockquote>
<p>setCI :: Persona -&gt; CI -&gt; Persona<br />setCI (Persona ci nm ap ed) ci' = Per ci' nm ap ed</p>
</blockquote>
<blockquote>
<p>setNombre :: Persona -&gt; Name -&gt; Persona<br />setNombre (Persona ci nm ap ed) nm' = Per ci nm' ap ed</p>
<p>setApellido :: Persona -&gt; LastName -&gt; Persona<br />setApellido (Persona ci nm ap ed) ap' = Per ci nm ap' ed</p>
<p>setEdad :: Persona -&gt; Edad -&gt; Persona<br />setEdad (Persona ci nm ap ed) ed' = Per ci nm ap ed'</p>
</blockquote>
<blockquote>
<p>getCI :: Persona -&gt; CI<br />getCI (Persona ci _ _ _) = ci</p>
<p>getNombre :: Persona -&gt; Name<br />getNombre (Persona _ nm _ _) = nm</p>
<p>getApellido :: Persona -&gt; LastName<br />getApellido (Persona _ _ ap _) = ap</p>
<p>getEdad :: Persona -&gt; Edad<br />getEdad (Persona _ _ _ ed) = ed</p>
</blockquote>
<p>Si hacemos algunas pruebas obtenemos:</p>
<blockquote>
<p>gt;*Main&gt; getCI p1</p>
</blockquote>
<p>nos retornaria el CI de 'Juan', tambien podemos obtener nombre, apellido o edad.</p>
<p>Para setear un valor, podemos hacer</p>
<blockquote>
<p>*Main&gt; p1 {nombre = "juanes"}<br />Persona {ci = 1212, nombre = "juanes", apellido = "Block", edad = 35}</p>
</blockquote>
<p>Y listo, mision cumplida, aunque un poco tedioso.&nbsp;<br />Bueno, esto no termina aqui, resulta que Haskell provee una forma diferente de definir los datatypes, esto es nombrando los elementos de cada constructor de datos. Llamado tambien records de Haskell.</p>
<p>Veamos como nos ayuda esto, en nuestra definicion de setters y getters, y como cambia a lo anterior ya hecho.</p>
<blockquote>
<p>data Persona = Per { ci &nbsp; &nbsp; &nbsp; &nbsp;:: CI<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , nombre :: Name<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , apellido :: LastName<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , edad &nbsp; &nbsp; :: Edad<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } deriving Show<br />type CI &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Int<br />type Name &nbsp; &nbsp; &nbsp; = String<br />type LastName = String<br />type Edad &nbsp; &nbsp; &nbsp; &nbsp;= Int</p>
</blockquote>
<p>Bueno, eso es todo lo que tenemos que hacer, hagamos algunas pruebas para ver algo de teoria.</p>
<blockquote>
<p>p3 = Per 2525 "Teo" "Flores" 43 &nbsp;-- creamos un instancia<br />* Main&gt; ci p3<br />2525<br />* Main&gt; p3{nombre = "Maria"}<br />Persona {ci = 2525, nombre = "Maria", apellido = "Flores", edad = 43}</p>
</blockquote>
<p>Como veras, hicimos las operaciones de set y get.</p>
<p>Algo de teoria, el nombramiento de campos en los datatypes no afecta al anterior version, por ejemplo el tipo contructor de datos es el mismo. Pero hay funcionalidades que se aumentan. Entre ellos tenemos la seleccion de campos usando labels, construccion usando labels y actualizacion de campos usando labels.</p>
<p>La seleccion de campos usando labels, es practicamente la operacion seter de un objeto. Y lo que Haskell hace es definir una funcion con el nombre del label, el cual esta disponible para su uso. Ejemplo "ci p3".</p>
<p>Tambien podemos contruir instancias usando labels (p4 = Per {edad=12, ci=3434, apellido="Perez", nombre="Pedro"} ), y no solo de la forma comun (p4 = Per 3434 12 "Pedro"&nbsp;"Perez"). Intensionalmente he cambiado las posiciones de los labels, pues esto no afecta. Se debe cuidar de que ningun label se repita mas de una ves, pero si no especificamos algun label, este deberia inicializar como indefinido o infito (GHC lo muestra como un warning).</p>
<p>Para la actualizacion de campos usando labels, se tiene una sintaxis: instancia_obj {label=value, ...}, asi como en el ejemplo p3{ci=3454}. Otra ves, no se debe mencionar mas de una ves una label, y los labels deben pertenecer al tipo contructor.</p>
<p>Al actualizar un valor de la instancia, se genera una nueva instancia modificando asi en la nueva instancia los valores enviados. Es una caracteristica de Persistencia de Haskell. Veamos un ejemplo:</p>
<blockquote>
<p>*Main&gt; p1 {edad = 0}<br />Persona {ci =&nbsp;1212, nombre = "Juan", apellido = "Block", edad = 0}<br />*Main&gt; p1<br />Persona {ci =&nbsp;1212, nombre = "Juan", apellido = "Block", edad = 35}</p>
</blockquote>
<p>Tambien podemos mesclar los distintos contructores de datos con esta sintxis o sin ella. Y respecto a los nombres de los labels, podemos repetirlas entre las funciones contructoras de datos, siempre y cuando se tenga un tipo consistente, pero no podemos repetirnas entre los datatypes, porque generaria una incosistencia de tipos. Veamos un ejemplo sacado del reporte de Haskell 98:</p>
<blockquote>
<p>data S = S1 {x :: Int}<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| S2 {x :: Int} &nbsp; -- ejemplo bueno</p>
<p>data T = T1 {y :: Int}<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| T2 {y :: Bool} &nbsp;-- ejemplo malo, tipo inconsistente</p>
</blockquote>
<p>En conclusion, esta forma de creacion de datatypes, a&ntilde;ade funcionalidad y sintaxis extra para manipular los elementos del datatype.</p>
<p>Algo interesante seria averiguar como definir mucha mas similitud de funcionalidad a OOP. Me refiero a definir solo funciones set o get para algunos elementos, o declarar elementos como publicos, protegidos o privados.</p>
<p>Hay otras extenciones de GHC que nos facilitan la manipulacion de records en Haskell. Pero los que hemos visto aqui pertenece al Haskell 98.</p>
</div>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota"><h3>Juan Jose Olivera</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/jotajota/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/jotajota/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/jotajota">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/jotajota">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/jotajota">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Juan Jose Olivera"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Osea, se copia todos los valores de la primera instancia + el valor pasado , y se crea una nueva instancia del data?</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Juan Jose Olivera</a> hace 392 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Si, eso es lo que hace.</p>
<p>Lo podemos ver en el ejemplo, " juan {edad = 0}" genera una nueva instancia con su valor attributo edad cambiado. pero cuando volvemos a mostrar "juan" (en la segunda corrida) esta intacto.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 390 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/annotation/18/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/7/" published="Tue, 11 Aug 2009 00:51:52 +0200" ><![CDATA[<p>Osea, se copia todos los valores de la primera instancia + el valor pasado , y se crea una nueva instancia del data?</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/annotation/21/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 12 Aug 2009 20:42:25 +0200" ><![CDATA[<p>Si, eso es lo que hace.</p>
<p>Lo podemos ver en el ejemplo, " juan {edad = 0}" genera una nueva instancia con su valor attributo edad cambiado. pero cuando volvemos a mostrar "juan" (en la segunda corrida) esta intacto.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/941/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[get]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/940/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[set]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/939/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/938/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[label datatype]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/937/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[records en Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/761/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 06 Aug 2009 02:27:37 +0200" ><![CDATA[on]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/936/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[setter]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/96/metadata/935/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/96/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Sun, 28 Feb 2010 02:22:10 +0100" ><![CDATA[getter]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/95/" class="object" subclass="blog" published="Wed, 05 Aug 2009 22:40:19 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="owner_uuid" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/21/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="container_uuid" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/21/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="title" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[Haskell string support]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="description" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[<p>Un problema muy interesante</p>
<pre>s = "&lambda;"
main = do
    writeFile "test.txt" s
    s2 &lt;- readFile "test.txt"
    print (s == s2)

</pre>
<p>Si analizamos y hacemos correr este peque&ntilde;o programa el resultado deberia ser True por logica, pero el resultado real es False.</p>
<p>Segun Christian creador del blog <a href="http://lukeplant.me.uk/blog.php" target="_blank">Luke Plant's</a></p>
<p>El problema es con la biblioteca est&aacute;ndar Haskell - muchas de las funciones previstas por el Prelud, System.IO, System.Posix y muchos otros son completamente roto (por dise&ntilde;o).&nbsp; <a href="http://lukeplant.me.uk/blog.php?id=1107301701" target="_blank">leer mas</a></p>
<p>Don Stewart dio la siguiente solucion para este problema</p>
<pre>    import Prelude hiding (writeFile, readFile, print)
    import System.IO.UTF8

    s = "&lambda;"
    main = do
        writeFile "test.txt" s
        s2 &lt;- readFile "test.txt"
        print (s == s2)

</pre>
<p>Si hacemos correr este ejemplo el resultado sera True.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/antonio/read/95/haskell-string-support">Haskell string support</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio"><h3>Antonio</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/antonio/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/antonio/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/antonio">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/antonio">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/antonio" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240977219&username=antonio&size=tiny" border="0"  title="Antonio"  /></a>
</div>

	    </div>
			<p class="strapline">
				August 5, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Antonio</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/antonio/read/95/haskell-string-support">Comentarios (4)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Un problema muy interesante</p>
<pre>s = "&lambda;"<br />
main = do<br />
    writeFile "test.txt" s<br />
    s2 &lt;- readFile "test.txt"<br />
    print (s == s2)</p>
</pre>
<p>Si analizamos y hacemos correr este peque&ntilde;o programa el resultado deberia ser True por logica, pero el resultado real es False.</p>
<p>Segun Christian creador del blog <a href="http://lukeplant.me.uk/blog.php" target="_blank">Luke Plant's</a></p>
<p>El problema es con la biblioteca est&aacute;ndar Haskell - muchas de las funciones previstas por el Prelud, System.IO, System.Posix y muchos otros son completamente roto (por dise&ntilde;o).&nbsp; <a href="http://lukeplant.me.uk/blog.php?id=1107301701" target="_blank">leer mas</a></p>
<p>Don Stewart dio la siguiente solucion para este problema</p>
<pre>    import Prelude hiding (writeFile, readFile, print)<br />
    import System.IO.UTF8</p>
<p>    s = "&lambda;"<br />
    main = do<br />
        writeFile "test.txt" s<br />
        s2 &lt;- readFile "test.txt"<br />
        print (s == s2)</p>
</pre>
<p>Si hacemos correr este ejemplo el resultado sera True.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Maybe ese problema ya se arreglo en la version 6.8.2 de GHC.<br />Pero a mi me devuelve True.</p>
<blockquote>
<p>carliros@cathrina:~/Documents/tmp$ cat antonio.hs <br />-- import Prelude hiding (writeFile, readFile, print)<br />-- import System.IO.UTF8</p>
<p>s = "&lambda;"</p>
<p>main = do<br />&nbsp;&nbsp;&nbsp; writeFile "test.txt" s<br />&nbsp;&nbsp;&nbsp; s2 &lt;- readFile "test.txt"<br />&nbsp;&nbsp;&nbsp; print (s == s)</p>
<p>carliros@cathrina:~/Documents/tmp$ ghci antonio.hs <br />GHCi, version 6.8.2: <a href="http://www.haskell.org/ghc/&nbsp;" style="text-decoration:underline;">http:/<wbr />/<wbr />www.haskell.org/<wbr />ghc/<wbr />&nbsp;</a> :? for help<br />Loading package base ... linking ... done.<br />[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( antonio.hs, interpreted )<br />Ok, modules loaded: Main.<br />*Main&gt; main<br />True<br />*Main&gt;</p>
</blockquote>
<p>Es mas, si inserto las librerias que dices, aun me sigue saliendo True.</p>
<p>Que version de GHC usas?</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 397 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Tal parece que ese bug es por no tener un buen soporte para Unicode en las versiones anteriores a GHC 6.12.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 397 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio"><h3>Antonio</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/antonio/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/antonio/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/antonio">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/antonio">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/antonio" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240977219&username=antonio&size=small" border="0"  title="Antonio"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Tengo la version 6.10.1 del ghc, se supone que deberia estar resuelto este bug ya que la version de tu ghc es una version antigua a la que yo tengo, tendriamos que probar con las ultimas verisiones del ghc para ver si sigue este problema</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Antonio</a> hace 396 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota"><h3>Juan Jose Olivera</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/jotajota/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/jotajota/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/jotajota">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/jotajota">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/jotajota">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Juan Jose Olivera"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Por lo que se no es un bug, si no mas bien que el ghc, no trabaja con utf8 por defecto(es necesario trabajar con bibliotecas extras si se quiere), en si trabaja con ansi, por lo que me imagino que en tu SO le pasas una cadena utf8 pero el ghc la interpreta como ansi por lo que no empareja.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Juan Jose Olivera</a> hace 392 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/annotation/15/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 06 Aug 2009 01:16:24 +0200" ><![CDATA[<p>Maybe ese problema ya se arreglo en la version 6.8.2 de GHC.<br />Pero a mi me devuelve True.</p>
<blockquote>
<p>carliros@cathrina:~/Documents/tmp$ cat antonio.hs <br />-- import Prelude hiding (writeFile, readFile, print)<br />-- import System.IO.UTF8<br /><br />s = "&lambda;"<br /><br />main = do<br />&nbsp;&nbsp;&nbsp; writeFile "test.txt" s<br />&nbsp;&nbsp;&nbsp; s2 &lt;- readFile "test.txt"<br />&nbsp;&nbsp;&nbsp; print (s == s)<br /><br />carliros@cathrina:~/Documents/tmp$ ghci antonio.hs <br />GHCi, version 6.8.2: http://www.haskell.org/ghc/&nbsp; :? for help<br />Loading package base ... linking ... done.<br />[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( antonio.hs, interpreted )<br />Ok, modules loaded: Main.<br />*Main&gt; main<br />True<br />*Main&gt;</p>
</blockquote>
<p>Es mas, si inserto las librerias que dices, aun me sigue saliendo True.</p>
<p>Que version de GHC usas?</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/annotation/16/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 06 Aug 2009 01:25:14 +0200" ><![CDATA[<p>Tal parece que ese bug es por no tener un buen soporte para Unicode en las versiones anteriores a GHC 6.12.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/annotation/17/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Thu, 06 Aug 2009 15:59:45 +0200" ><![CDATA[<p>Tengo la version 6.10.1 del ghc, se supone que deberia estar resuelto este bug ya que la version de tu ghc es una version antigua a la que yo tengo, tendriamos que probar con las ultimas verisiones del ghc para ver si sigue este problema</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/annotation/19/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/7/" published="Tue, 11 Aug 2009 00:54:18 +0200" ><![CDATA[<p>Por lo que se no es un bug, si no mas bien que el ghc, no trabaja con utf8 por defecto(es necesario trabajar con bibliotecas extras si se quiere), en si trabaja con ansi, por lo que me imagino que en tu SO le pasas una cadena utf8 pero el ghc la interpreta como ansi por lo que no empareja.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/metadata/751/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/metadata/752/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/95/" class="object" subclass="blog" published="Wed, 05 Aug 2009 22:40:19 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="owner_uuid" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/21/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="container_uuid" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/21/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="title" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[Haskell string support]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="description" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[<p>Un problema muy interesante</p>
<pre>s = "&lambda;"
main = do
    writeFile "test.txt" s
    s2 &lt;- readFile "test.txt"
    print (s == s2)

</pre>
<p>Si analizamos y hacemos correr este peque&ntilde;o programa el resultado deberia ser True por logica, pero el resultado real es False.</p>
<p>Segun Christian creador del blog <a href="http://lukeplant.me.uk/blog.php" target="_blank">Luke Plant's</a></p>
<p>El problema es con la biblioteca est&aacute;ndar Haskell - muchas de las funciones previstas por el Prelud, System.IO, System.Posix y muchos otros son completamente roto (por dise&ntilde;o).&nbsp; <a href="http://lukeplant.me.uk/blog.php?id=1107301701" target="_blank">leer mas</a></p>
<p>Don Stewart dio la siguiente solucion para este problema</p>
<pre>    import Prelude hiding (writeFile, readFile, print)
    import System.IO.UTF8

    s = "&lambda;"
    main = do
        writeFile "test.txt" s
        s2 &lt;- readFile "test.txt"
        print (s == s2)

</pre>
<p>Si hacemos correr este ejemplo el resultado sera True.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/antonio/read/95/haskell-string-support">Haskell string support</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio"><h3>Antonio</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/antonio/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/antonio/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/antonio">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/antonio">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/antonio" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240977219&username=antonio&size=tiny" border="0"  title="Antonio"  /></a>
</div>

	    </div>
			<p class="strapline">
				August 5, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Antonio</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/antonio/read/95/haskell-string-support">Comentarios (4)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Un problema muy interesante</p>
<pre>s = "&lambda;"<br />
main = do<br />
    writeFile "test.txt" s<br />
    s2 &lt;- readFile "test.txt"<br />
    print (s == s2)</p>
</pre>
<p>Si analizamos y hacemos correr este peque&ntilde;o programa el resultado deberia ser True por logica, pero el resultado real es False.</p>
<p>Segun Christian creador del blog <a href="http://lukeplant.me.uk/blog.php" target="_blank">Luke Plant's</a></p>
<p>El problema es con la biblioteca est&aacute;ndar Haskell - muchas de las funciones previstas por el Prelud, System.IO, System.Posix y muchos otros son completamente roto (por dise&ntilde;o).&nbsp; <a href="http://lukeplant.me.uk/blog.php?id=1107301701" target="_blank">leer mas</a></p>
<p>Don Stewart dio la siguiente solucion para este problema</p>
<pre>    import Prelude hiding (writeFile, readFile, print)<br />
    import System.IO.UTF8</p>
<p>    s = "&lambda;"<br />
    main = do<br />
        writeFile "test.txt" s<br />
        s2 &lt;- readFile "test.txt"<br />
        print (s == s2)</p>
</pre>
<p>Si hacemos correr este ejemplo el resultado sera True.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Maybe ese problema ya se arreglo en la version 6.8.2 de GHC.<br />Pero a mi me devuelve True.</p>
<blockquote>
<p>carliros@cathrina:~/Documents/tmp$ cat antonio.hs <br />-- import Prelude hiding (writeFile, readFile, print)<br />-- import System.IO.UTF8</p>
<p>s = "&lambda;"</p>
<p>main = do<br />&nbsp;&nbsp;&nbsp; writeFile "test.txt" s<br />&nbsp;&nbsp;&nbsp; s2 &lt;- readFile "test.txt"<br />&nbsp;&nbsp;&nbsp; print (s == s)</p>
<p>carliros@cathrina:~/Documents/tmp$ ghci antonio.hs <br />GHCi, version 6.8.2: <a href="http://www.haskell.org/ghc/&nbsp;" style="text-decoration:underline;">http:/<wbr />/<wbr />www.haskell.org/<wbr />ghc/<wbr />&nbsp;</a> :? for help<br />Loading package base ... linking ... done.<br />[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( antonio.hs, interpreted )<br />Ok, modules loaded: Main.<br />*Main&gt; main<br />True<br />*Main&gt;</p>
</blockquote>
<p>Es mas, si inserto las librerias que dices, aun me sigue saliendo True.</p>
<p>Que version de GHC usas?</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 397 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=small" border="0"  title="Carlos Gomez"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Tal parece que ese bug es por no tener un buen soporte para Unicode en las versiones anteriores a GHC 6.12.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Carlos Gomez</a> hace 397 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio"><h3>Antonio</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/antonio/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/antonio/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/antonio">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/antonio">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/antonio" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240977219&username=antonio&size=small" border="0"  title="Antonio"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Tengo la version 6.10.1 del ghc, se supone que deberia estar resuelto este bug ya que la version de tu ghc es una version antigua a la que yo tengo, tendriamos que probar con las ultimas verisiones del ghc para ver si sigue este problema</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Antonio</a> hace 396 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota"><h3>Juan Jose Olivera</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/jotajota/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/jotajota/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/jotajota">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/jotajota">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/jotajota">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Juan Jose Olivera"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Por lo que se no es un bug, si no mas bien que el ghc, no trabaja con utf8 por defecto(es necesario trabajar con bibliotecas extras si se quiere), en si trabaja con ansi, por lo que me imagino que en tu SO le pasas una cadena utf8 pero el ghc la interpreta como ansi por lo que no empareja.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Juan Jose Olivera</a> hace 392 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/annotation/15/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 06 Aug 2009 01:16:24 +0200" ><![CDATA[<p>Maybe ese problema ya se arreglo en la version 6.8.2 de GHC.<br />Pero a mi me devuelve True.</p>
<blockquote>
<p>carliros@cathrina:~/Documents/tmp$ cat antonio.hs <br />-- import Prelude hiding (writeFile, readFile, print)<br />-- import System.IO.UTF8<br /><br />s = "&lambda;"<br /><br />main = do<br />&nbsp;&nbsp;&nbsp; writeFile "test.txt" s<br />&nbsp;&nbsp;&nbsp; s2 &lt;- readFile "test.txt"<br />&nbsp;&nbsp;&nbsp; print (s == s)<br /><br />carliros@cathrina:~/Documents/tmp$ ghci antonio.hs <br />GHCi, version 6.8.2: http://www.haskell.org/ghc/&nbsp; :? for help<br />Loading package base ... linking ... done.<br />[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( antonio.hs, interpreted )<br />Ok, modules loaded: Main.<br />*Main&gt; main<br />True<br />*Main&gt;</p>
</blockquote>
<p>Es mas, si inserto las librerias que dices, aun me sigue saliendo True.</p>
<p>Que version de GHC usas?</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/annotation/16/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 06 Aug 2009 01:25:14 +0200" ><![CDATA[<p>Tal parece que ese bug es por no tener un buen soporte para Unicode en las versiones anteriores a GHC 6.12.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/annotation/17/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Thu, 06 Aug 2009 15:59:45 +0200" ><![CDATA[<p>Tengo la version 6.10.1 del ghc, se supone que deberia estar resuelto este bug ya que la version de tu ghc es una version antigua a la que yo tengo, tendriamos que probar con las ultimas verisiones del ghc para ver si sigue este problema</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/annotation/19/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/7/" published="Tue, 11 Aug 2009 00:54:18 +0200" ><![CDATA[<p>Por lo que se no es un bug, si no mas bien que el ghc, no trabaja con utf8 por defecto(es necesario trabajar con bibliotecas extras si se quiere), en si trabaja con ansi, por lo que me imagino que en tu SO le pasas una cadena utf8 pero el ghc la interpreta como ansi por lo que no empareja.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/metadata/751/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/95/metadata/752/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/95/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Wed, 05 Aug 2009 22:40:19 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/89/" class="object" subclass="blog" published="Wed, 29 Jul 2009 23:49:54 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="owner_uuid" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="container_uuid" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="title" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[Cabal (Common Architecture for Building Applications and Libraries)]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="description" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[<p>&nbsp;</p>
<p>Hoy revizaremos una forma de instalar Cabal, una herramienta muy comoda para instalar y construir aplicaciones y librerias de haskell.</p>
<p>Para una informacion mas detallada puedes ver <a href="http://comunidadhaskell.org/index.php/comunidad-haskell-material.html" target="_blank">Biliotecas adicionales con Cabal</a>.</p>
<p>Pero hagamos lo nuestro:</p>
<p>La forma que abordaremos es instalar cabal atraves de un bootstrap, el cual se encargara de descargar las fuentes, configurarlas e instalarlas.</p>
<p>Antes de continuar debemos preveer que disponemos de 3 cosas basicas (Doy por supuesto que tienen instalado ghc 8 o superior):</p>
<p>Nota.- Los siguientes comandos son para un sis ope basado en Debian (esto incluye a ubuntu).</p>
<p>1.- parsec library of ghc.<br />&nbsp;&nbsp;&nbsp;&nbsp; Si no tienes instalado, puedes instalarlo con:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install libghc6-parsec-dev libghc6-parsec-doc<br /><br />2.- network library of ghc.<br />&nbsp;&nbsp;&nbsp;&nbsp; Si no tienes instalado, puedes instalarlo con:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install libghc6-network-dev libghc6-network-doc libghc6-network-prof<br /><br />3.- zlib.h header of C.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Podemos encontrar el header zlib.h en la libreria zlib1g-dev.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Comandos para instalarlo:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install zlib1g-dev</p>
<p>Despues de preever las anteriores cosas podemos descargar el Cabal Install Tool de la pagina http://www.haskell.org/cabal/download.html.</p>
<p>Descargar Cabal Install Tool 0.6.2.tar.gz, y ejecutamos el bootstrap.sh</p>
<p>Ejecutando ./bootstrap.sh se descargara las fuentes de cabal de la web, luego se configuran y finalmente se instalaran en tu sistema (Debes notar que necesitaras una coneccion a internet cuando estes ejecutando el bootstrap).</p>
<p>&nbsp;</p>
<p>Ahora que ya esta instalado cabal, debemos publicar el comando cabal ubicado en /root_or_user_/.cabal/bin. Podriamos crear un enlace a este comando en /usr/bin con <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ln -s /root/.cabal/cabal cabal</p>
<p>Antes de usarlo debemos actualizar la lista de paquetes con <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cabal update</p>
<p>Ahora podremos disfrutar de Cabal, e instalar otras aplicaciones.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/89/cabal-common-architecture-for-building-applications-and-libraries">Cabal (Common Architecture for Building Applications and Libraries)</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				July 29, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/89/cabal-common-architecture-for-building-applications-and-libraries">Comentarios (2)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/install+cabal">install cabal</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/cabal">cabal</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>&nbsp;</p>
<p>Hoy revizaremos una forma de instalar Cabal, una herramienta muy comoda para instalar y construir aplicaciones y librerias de haskell.</p>
<p>Para una informacion mas detallada puedes ver <a href="http://comunidadhaskell.org/index.php/comunidad-haskell-material.html" target="_blank">Biliotecas adicionales con Cabal</a>.</p>
<p>Pero hagamos lo nuestro:</p>
<p>La forma que abordaremos es instalar cabal atraves de un bootstrap, el cual se encargara de descargar las fuentes, configurarlas e instalarlas.</p>
<p>Antes de continuar debemos preveer que disponemos de 3 cosas basicas (Doy por supuesto que tienen instalado ghc 8 o superior):</p>
<p>Nota.- Los siguientes comandos son para un sis ope basado en Debian (esto incluye a ubuntu).</p>
<p>1.- parsec library of ghc.<br />&nbsp;&nbsp;&nbsp;&nbsp; Si no tienes instalado, puedes instalarlo con:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install libghc6-parsec-dev libghc6-parsec-doc</p>
<p>2.- network library of ghc.<br />&nbsp;&nbsp;&nbsp;&nbsp; Si no tienes instalado, puedes instalarlo con:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install libghc6-network-dev libghc6-network-doc libghc6-network-prof</p>
<p>3.- zlib.h header of C.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Podemos encontrar el header zlib.h en la libreria zlib1g-dev.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Comandos para instalarlo:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install zlib1g-dev</p>
<p>Despues de preever las anteriores cosas podemos descargar el Cabal Install Tool de la pagina <a href="http://www.haskell.org/cabal/download.html." style="text-decoration:underline;">http:/<wbr />/<wbr />www.haskell.org/<wbr />cabal/<wbr />download.html.</a></p>
<p>Descargar Cabal Install Tool 0.6.2.tar.gz, y ejecutamos el bootstrap.sh</p>
<p>Ejecutando ./bootstrap.sh se descargara las fuentes de cabal de la web, luego se configuran y finalmente se instalaran en tu sistema (Debes notar que necesitaras una coneccion a internet cuando estes ejecutando el bootstrap).</p>
<p>&nbsp;</p>
<p>Ahora que ya esta instalado cabal, debemos publicar el comando cabal ubicado en /root_or_user_/.cabal/bin. Podriamos crear un enlace a este comando en /usr/bin con <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ln -s /root/.cabal/cabal cabal</p>
<p>Antes de usarlo debemos actualizar la lista de paquetes con <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cabal update</p>
<p>Ahora podremos disfrutar de Cabal, e instalar otras aplicaciones.</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio"><h3>Antonio</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/antonio/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/antonio/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/antonio">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/antonio">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/antonio" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240977219&username=antonio&size=small" border="0"  title="Antonio"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Cabal es poder!!!</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Antonio</a> hace 402 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota"><h3>Juan Jose Olivera</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/jotajota/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/jotajota/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/jotajota">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/jotajota">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/jotajota">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Juan Jose Olivera"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>sip, hace tiempo vi algo que se llamaba cabal-get, que era una suerte de apt-get para bibliotecas y dependencias en haskell.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Juan Jose Olivera</a> hace 392 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/annotation/14/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Fri, 31 Jul 2009 22:24:03 +0200" ><![CDATA[<p>Cabal es poder!!!</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/annotation/20/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/7/" published="Tue, 11 Aug 2009 00:55:11 +0200" ><![CDATA[<p>sip, hace tiempo vi algo que se llamaba cabal-get, que era una suerte de apt-get para bibliotecas y dependencias en haskell.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/metadata/651/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 30 Jul 2009 00:29:28 +0200" ><![CDATA[install cabal]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/metadata/650/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 30 Jul 2009 00:29:28 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/metadata/649/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 30 Jul 2009 00:29:28 +0200" ><![CDATA[cabal]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/metadata/645/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/89/" class="object" subclass="blog" published="Wed, 29 Jul 2009 23:49:54 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="owner_uuid" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="container_uuid" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="title" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[Cabal (Common Architecture for Building Applications and Libraries)]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="description" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[<p>&nbsp;</p>
<p>Hoy revizaremos una forma de instalar Cabal, una herramienta muy comoda para instalar y construir aplicaciones y librerias de haskell.</p>
<p>Para una informacion mas detallada puedes ver <a href="http://comunidadhaskell.org/index.php/comunidad-haskell-material.html" target="_blank">Biliotecas adicionales con Cabal</a>.</p>
<p>Pero hagamos lo nuestro:</p>
<p>La forma que abordaremos es instalar cabal atraves de un bootstrap, el cual se encargara de descargar las fuentes, configurarlas e instalarlas.</p>
<p>Antes de continuar debemos preveer que disponemos de 3 cosas basicas (Doy por supuesto que tienen instalado ghc 8 o superior):</p>
<p>Nota.- Los siguientes comandos son para un sis ope basado en Debian (esto incluye a ubuntu).</p>
<p>1.- parsec library of ghc.<br />&nbsp;&nbsp;&nbsp;&nbsp; Si no tienes instalado, puedes instalarlo con:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install libghc6-parsec-dev libghc6-parsec-doc<br /><br />2.- network library of ghc.<br />&nbsp;&nbsp;&nbsp;&nbsp; Si no tienes instalado, puedes instalarlo con:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install libghc6-network-dev libghc6-network-doc libghc6-network-prof<br /><br />3.- zlib.h header of C.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Podemos encontrar el header zlib.h en la libreria zlib1g-dev.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Comandos para instalarlo:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install zlib1g-dev</p>
<p>Despues de preever las anteriores cosas podemos descargar el Cabal Install Tool de la pagina http://www.haskell.org/cabal/download.html.</p>
<p>Descargar Cabal Install Tool 0.6.2.tar.gz, y ejecutamos el bootstrap.sh</p>
<p>Ejecutando ./bootstrap.sh se descargara las fuentes de cabal de la web, luego se configuran y finalmente se instalaran en tu sistema (Debes notar que necesitaras una coneccion a internet cuando estes ejecutando el bootstrap).</p>
<p>&nbsp;</p>
<p>Ahora que ya esta instalado cabal, debemos publicar el comando cabal ubicado en /root_or_user_/.cabal/bin. Podriamos crear un enlace a este comando en /usr/bin con <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ln -s /root/.cabal/cabal cabal</p>
<p>Antes de usarlo debemos actualizar la lista de paquetes con <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cabal update</p>
<p>Ahora podremos disfrutar de Cabal, e instalar otras aplicaciones.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/89/cabal-common-architecture-for-building-applications-and-libraries">Cabal (Common Architecture for Building Applications and Libraries)</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				July 29, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/89/cabal-common-architecture-for-building-applications-and-libraries">Comentarios (2)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/install+cabal">install cabal</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/cabal">cabal</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>&nbsp;</p>
<p>Hoy revizaremos una forma de instalar Cabal, una herramienta muy comoda para instalar y construir aplicaciones y librerias de haskell.</p>
<p>Para una informacion mas detallada puedes ver <a href="http://comunidadhaskell.org/index.php/comunidad-haskell-material.html" target="_blank">Biliotecas adicionales con Cabal</a>.</p>
<p>Pero hagamos lo nuestro:</p>
<p>La forma que abordaremos es instalar cabal atraves de un bootstrap, el cual se encargara de descargar las fuentes, configurarlas e instalarlas.</p>
<p>Antes de continuar debemos preveer que disponemos de 3 cosas basicas (Doy por supuesto que tienen instalado ghc 8 o superior):</p>
<p>Nota.- Los siguientes comandos son para un sis ope basado en Debian (esto incluye a ubuntu).</p>
<p>1.- parsec library of ghc.<br />&nbsp;&nbsp;&nbsp;&nbsp; Si no tienes instalado, puedes instalarlo con:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install libghc6-parsec-dev libghc6-parsec-doc</p>
<p>2.- network library of ghc.<br />&nbsp;&nbsp;&nbsp;&nbsp; Si no tienes instalado, puedes instalarlo con:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install libghc6-network-dev libghc6-network-doc libghc6-network-prof</p>
<p>3.- zlib.h header of C.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Podemos encontrar el header zlib.h en la libreria zlib1g-dev.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Comandos para instalarlo:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apt-get install zlib1g-dev</p>
<p>Despues de preever las anteriores cosas podemos descargar el Cabal Install Tool de la pagina <a href="http://www.haskell.org/cabal/download.html." style="text-decoration:underline;">http:/<wbr />/<wbr />www.haskell.org/<wbr />cabal/<wbr />download.html.</a></p>
<p>Descargar Cabal Install Tool 0.6.2.tar.gz, y ejecutamos el bootstrap.sh</p>
<p>Ejecutando ./bootstrap.sh se descargara las fuentes de cabal de la web, luego se configuran y finalmente se instalaran en tu sistema (Debes notar que necesitaras una coneccion a internet cuando estes ejecutando el bootstrap).</p>
<p>&nbsp;</p>
<p>Ahora que ya esta instalado cabal, debemos publicar el comando cabal ubicado en /root_or_user_/.cabal/bin. Podriamos crear un enlace a este comando en /usr/bin con <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ln -s /root/.cabal/cabal cabal</p>
<p>Antes de usarlo debemos actualizar la lista de paquetes con <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cabal update</p>
<p>Ahora podremos disfrutar de Cabal, e instalar otras aplicaciones.</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>



	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio"><h3>Antonio</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/antonio/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/antonio/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/antonio">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/antonio">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/antonio" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240977219&username=antonio&size=small" border="0"  title="Antonio"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>Cabal es poder!!!</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Antonio</a> hace 402 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->

	<div class="generic_comment"><!-- start of generic_comment div -->
	    
		<div class="generic_comment_icon">	        
    		<div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota"><h3>Juan Jose Olivera</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/jotajota/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/jotajota/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/jotajota">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/jotajota">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/jotajota">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/jotajota" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/natural_brown_theme/graphics/user_icons/defaultsmall.gif" border="0"  title="Juan Jose Olivera"  /></a>
</div>

		</div>
		<div class="generic_comment_details">
    		
		    <!-- output the actual comment -->
		    <p>sip, hace tiempo vi algo que se llamaba cabal-get, que era una suerte de apt-get para bibliotecas y dependencias en haskell.</p>
		    
		    <p class="generic_comment_owner">
    	        <a href="http://blog.comunidadhaskell.org/pg/profile/jotajota">Juan Jose Olivera</a> hace 392 dias    		</p>
		    
		    		</div><!-- end of generic_comment_details -->
	</div><!-- end of generic_comment div -->]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/annotation/14/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Fri, 31 Jul 2009 22:24:03 +0200" ><![CDATA[<p>Cabal es poder!!!</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/annotation/20/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="generic_comment" type="annotation" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/7/" published="Tue, 11 Aug 2009 00:55:11 +0200" ><![CDATA[<p>sip, hace tiempo vi algo que se llamaba cabal-get, que era una suerte de apt-get para bibliotecas y dependencias en haskell.</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/metadata/651/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 30 Jul 2009 00:29:28 +0200" ><![CDATA[install cabal]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/metadata/650/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 30 Jul 2009 00:29:28 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/metadata/649/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Thu, 30 Jul 2009 00:29:28 +0200" ><![CDATA[cabal]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/89/metadata/645/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/89/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Wed, 29 Jul 2009 23:49:54 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/88/" class="object" subclass="blog" published="Thu, 09 Jul 2009 01:26:42 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="owner_uuid" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/21/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="container_uuid" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/21/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="title" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[Hayoo! beta 0.4]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="description" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[<p>Recientemente se lanzo <a href="http://holumbus.fh-wedel.de/hayoo/hayoo.html" target="_blank" title="hayoo">Hayoo</a>! beta 0.4.</p>
<p><img src="http://holumbus.fh-wedel.de/hayoo/hayoo/hayoo.png" border="0" alt="hayoo" width="220" height="80" /></p>
<p>Hayoo! es un motor de b&uacute;squeda especializado en documentaci&oacute;n del&nbsp; API Haskell. El objetivo de Hayoo! es proporcionar una forma interactiva, f&aacute;cil de usar la interfaz de b&uacute;squeda de la documenation de Haskell para los diversos paquetes y bibliotecas.</p>
<p>Seria super que lo testen, ya que si falta alguna documentacion solo hay que escribirles a los desarrolladores al siguiente correo hayoo@holumbus.org para que lo puedan agregar.</p>
<p>Para mi es mejor que <a href="http://haskell.org/hoogle/" target="_blank" title="hoogle">hoogle</a>&nbsp;</p>
<p><img src="http://haskell.org/hoogle/res/hoogle.png" border="0" alt="hoogle" width="160" height="58" /></p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/antonio/read/88/hayoo-beta-04">Hayoo! beta 0.4</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio"><h3>Antonio</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/antonio/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/antonio/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/antonio">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/antonio">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/antonio" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240977219&username=antonio&size=tiny" border="0"  title="Antonio"  /></a>
</div>

	    </div>
			<p class="strapline">
				July 9, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Antonio</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/antonio/read/88/hayoo-beta-04">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/hayoo">hayoo</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/hoogle">hoogle</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Recientemente se lanzo <a href="http://holumbus.fh-wedel.de/hayoo/hayoo.html" target="_blank" title="hayoo">Hayoo</a>! beta 0.4.</p>
<p><img src="http://holumbus.fh-wedel.de/hayoo/hayoo/hayoo.png" border="0" alt="hayoo" width="220" height="80" /></p>
<p>Hayoo! es un motor de b&uacute;squeda especializado en documentaci&oacute;n del&nbsp; API Haskell. El objetivo de Hayoo! es proporcionar una forma interactiva, f&aacute;cil de usar la interfaz de b&uacute;squeda de la documenation de Haskell para los diversos paquetes y bibliotecas.</p>
<p>Seria super que lo testen, ya que si falta alguna documentacion solo hay que escribirles a los desarrolladores al siguiente correo hayoo@holumbus.org para que lo puedan agregar.</p>
<p>Para mi es mejor que <a href="http://haskell.org/hoogle/" target="_blank" title="hoogle">hoogle</a>&nbsp;</p>
<p><img src="http://haskell.org/hoogle/res/hoogle.png" border="0" alt="hoogle" width="160" height="58" /></p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/metadata/638/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Thu, 09 Jul 2009 01:28:43 +0200" ><![CDATA[hayoo]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/metadata/637/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Thu, 09 Jul 2009 01:28:43 +0200" ><![CDATA[hoogle]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/metadata/633/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/88/" class="object" subclass="blog" published="Thu, 09 Jul 2009 01:26:42 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="owner_uuid" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/21/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="container_uuid" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/21/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="title" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[Hayoo! beta 0.4]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="description" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[<p>Recientemente se lanzo <a href="http://holumbus.fh-wedel.de/hayoo/hayoo.html" target="_blank" title="hayoo">Hayoo</a>! beta 0.4.</p>
<p><img src="http://holumbus.fh-wedel.de/hayoo/hayoo/hayoo.png" border="0" alt="hayoo" width="220" height="80" /></p>
<p>Hayoo! es un motor de b&uacute;squeda especializado en documentaci&oacute;n del&nbsp; API Haskell. El objetivo de Hayoo! es proporcionar una forma interactiva, f&aacute;cil de usar la interfaz de b&uacute;squeda de la documenation de Haskell para los diversos paquetes y bibliotecas.</p>
<p>Seria super que lo testen, ya que si falta alguna documentacion solo hay que escribirles a los desarrolladores al siguiente correo hayoo@holumbus.org para que lo puedan agregar.</p>
<p>Para mi es mejor que <a href="http://haskell.org/hoogle/" target="_blank" title="hoogle">hoogle</a>&nbsp;</p>
<p><img src="http://haskell.org/hoogle/res/hoogle.png" border="0" alt="hoogle" width="160" height="58" /></p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/antonio/read/88/hayoo-beta-04">Hayoo! beta 0.4</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio"><h3>Antonio</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/antonio">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/antonio/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/antonio/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/antonio">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/antonio">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/antonio" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1240977219&username=antonio&size=tiny" border="0"  title="Antonio"  /></a>
</div>

	    </div>
			<p class="strapline">
				July 9, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/antonio">Antonio</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/antonio/read/88/hayoo-beta-04">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/hayoo">hayoo</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/hoogle">hoogle</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Recientemente se lanzo <a href="http://holumbus.fh-wedel.de/hayoo/hayoo.html" target="_blank" title="hayoo">Hayoo</a>! beta 0.4.</p>
<p><img src="http://holumbus.fh-wedel.de/hayoo/hayoo/hayoo.png" border="0" alt="hayoo" width="220" height="80" /></p>
<p>Hayoo! es un motor de b&uacute;squeda especializado en documentaci&oacute;n del&nbsp; API Haskell. El objetivo de Hayoo! es proporcionar una forma interactiva, f&aacute;cil de usar la interfaz de b&uacute;squeda de la documenation de Haskell para los diversos paquetes y bibliotecas.</p>
<p>Seria super que lo testen, ya que si falta alguna documentacion solo hay que escribirles a los desarrolladores al siguiente correo hayoo@holumbus.org para que lo puedan agregar.</p>
<p>Para mi es mejor que <a href="http://haskell.org/hoogle/" target="_blank" title="hoogle">hoogle</a>&nbsp;</p>
<p><img src="http://haskell.org/hoogle/res/hoogle.png" border="0" alt="hoogle" width="160" height="58" /></p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/metadata/638/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Thu, 09 Jul 2009 01:28:43 +0200" ><![CDATA[hayoo]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/metadata/637/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Thu, 09 Jul 2009 01:28:43 +0200" ><![CDATA[hoogle]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/88/metadata/633/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/88/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/21/" published="Thu, 09 Jul 2009 01:26:42 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/79/" class="object" subclass="blog" published="Fri, 19 Jun 2009 06:30:34 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="owner_uuid" published="Fri, 19 Jun 2009 06:30:34 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="container_uuid" published="Fri, 19 Jun 2009 06:30:34 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="title" published="Fri, 19 Jun 2009 06:30:34 +0200" ><![CDATA[IRC Channel Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="description" published="Fri, 19 Jun 2009 06:30:34 +0200" ><![CDATA[<p>Navegando por la Web encontre un Canal IRC.</p>
<p>No sabia que existia un lugar online en donde se puede chatear con otros haskelleros.</p>
<p>Segun ellos, este IRC puede ser usado para aprender mas acerca de haskell, enterarse de nuevas cosas de haskell, porque muchas nuevas cosas primero dice que aparecen en el irc.</p>
<p>Bueno, no quise esperar mucho para unirme.</p>
<p>Para unirte puedes usar cualquier chat que te permita unirte al irc, en lo particular yo use irssi, pero puedes usar pidgin u otro.</p>
<p><strong>apt-get install irssi</strong></p>
<p>luego, &gt;<strong> irssi -c chat.freenode.net -n tunickname<br /></strong></p>
<p>puedes usar cualquier nick que no este repetido actualmente, pero si despues dela primera ves quieres mantenerte con ese nick deberas registrarte, como ?, puedes ver <a href="http://freenode.net/faq.shtml#nicksetup" title="freenode-step-to-register">frenode-register</a></p>
<p>una ves adentro seleccionar el salon al que quieres ingresar, en nuestro caso</p>
<p><strong>/join #haskell</strong></p>
<p>y listo, a chatear con los cuates.</p>
<p>Para mas informacion puedes ver este enlace <a href="http://www.haskell.org/haskellwiki/IRC_channel" title="irc-haskell">irc-haskell</a>, en el cual encontraras otros salones de chat relacionados a haskell.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/79/irc-channel-haskell">IRC Channel Haskell</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				June 19, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/79/irc-channel-haskell">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/irs">irs</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/chat">chat</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Navegando por la Web encontre un Canal IRC.</p>
<p>No sabia que existia un lugar online en donde se puede chatear con otros haskelleros.</p>
<p>Segun ellos, este IRC puede ser usado para aprender mas acerca de haskell, enterarse de nuevas cosas de haskell, porque muchas nuevas cosas primero dice que aparecen en el irc.</p>
<p>Bueno, no quise esperar mucho para unirme.</p>
<p>Para unirte puedes usar cualquier chat que te permita unirte al irc, en lo particular yo use irssi, pero puedes usar pidgin u otro.</p>
<p><strong>apt-get install irssi</strong></p>
<p>luego, &gt;<strong> irssi -c chat.freenode.net -n tunickname<br /></strong></p>
<p>puedes usar cualquier nick que no este repetido actualmente, pero si despues dela primera ves quieres mantenerte con ese nick deberas registrarte, como ?, puedes ver <a href="http://freenode.net/faq.shtml#nicksetup" title="freenode-step-to-register">frenode-register</a></p>
<p>una ves adentro seleccionar el salon al que quieres ingresar, en nuestro caso</p>
<p><strong>/join #haskell</strong></p>
<p>y listo, a chatear con los cuates.</p>
<p>Para mas informacion puedes ver este enlace <a href="http://www.haskell.org/haskellwiki/IRC_channel" title="irc-haskell">irc-haskell</a>, en el cual encontraras otros salones de chat relacionados a haskell.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/metadata/606/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 19 Jun 2009 18:57:35 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/metadata/605/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 19 Jun 2009 18:57:35 +0200" ><![CDATA[irs]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/metadata/604/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 19 Jun 2009 18:57:35 +0200" ><![CDATA[chat]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/metadata/600/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 19 Jun 2009 06:30:35 +0200" ><![CDATA[on]]></metadata>
<entity uuid="http://blog.comunidadhaskell.org/export/opendd/79/" class="object" subclass="blog" published="Fri, 19 Jun 2009 06:30:34 +0200" />
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/attr/owner_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="owner_uuid" published="Fri, 19 Jun 2009 06:30:34 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/attr/container_uuid/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="container_uuid" published="Fri, 19 Jun 2009 06:30:34 +0200" ><![CDATA[http://blog.comunidadhaskell.org/export/opendd/5/]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/attr/title/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="title" published="Fri, 19 Jun 2009 06:30:34 +0200" ><![CDATA[IRC Channel Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/attr/description/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="description" published="Fri, 19 Jun 2009 06:30:34 +0200" ><![CDATA[<p>Navegando por la Web encontre un Canal IRC.</p>
<p>No sabia que existia un lugar online en donde se puede chatear con otros haskelleros.</p>
<p>Segun ellos, este IRC puede ser usado para aprender mas acerca de haskell, enterarse de nuevas cosas de haskell, porque muchas nuevas cosas primero dice que aparecen en el irc.</p>
<p>Bueno, no quise esperar mucho para unirme.</p>
<p>Para unirte puedes usar cualquier chat que te permita unirte al irc, en lo particular yo use irssi, pero puedes usar pidgin u otro.</p>
<p><strong>apt-get install irssi</strong></p>
<p>luego, &gt;<strong> irssi -c chat.freenode.net -n tunickname<br /></strong></p>
<p>puedes usar cualquier nick que no este repetido actualmente, pero si despues dela primera ves quieres mantenerte con ese nick deberas registrarte, como ?, puedes ver <a href="http://freenode.net/faq.shtml#nicksetup" title="freenode-step-to-register">frenode-register</a></p>
<p>una ves adentro seleccionar el salon al que quieres ingresar, en nuestro caso</p>
<p><strong>/join #haskell</strong></p>
<p>y listo, a chatear con los cuates.</p>
<p>Para mas informacion puedes ver este enlace <a href="http://www.haskell.org/haskellwiki/IRC_channel" title="irc-haskell">irc-haskell</a>, en el cual encontraras otros salones de chat relacionados a haskell.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/volatile/renderedentity/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="renderedentity" type="volatile" ><![CDATA[
	<div class="contentWrapper singleview">
	
	<div class="blog_post">
		<h3><a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/79/irc-channel-haskell">IRC Channel Haskell</a></h3>
		<!-- display the user icon -->
		<div class="blog_post_icon">
		    <div class="usericon">
<div class="avatar_menu_button"><img src="http://blog.comunidadhaskell.org/_graphics/spacer.gif" border="0" width="15px" height="15px" /></div>

	<div class="sub_menu">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros"><h3>Carlos Gomez</h3></a>
		
	<p class="user_menu_profile">
		<a href="http://blog.comunidadhaskell.org/pg/profile/carliros">Perfil</a>
	</p>
	<p class="user_menu_friends">
		<a href="http://blog.comunidadhaskell.org/pg/friends/carliros/">Amigos</a>	
	</p>
	<p class="user_menu_friends_of">
		<a href="http://blog.comunidadhaskell.org/pg/friendsof/carliros/">Amigos de</a>	
	</p><p class="user_menu_pages">
		<a href="http://blog.comunidadhaskell.org/pg/pages/owned/carliros">P&aacute;ginas</a>	
	</p>
	<p class="user_menu_blog">
		<a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Blog</a>	
	</p>
	<p class="user_menu_file">
		<a href="http://blog.comunidadhaskell.org/pg/file/carliros">Ficheros</a>	
	</p>	</div>	
	<a href="http://blog.comunidadhaskell.org/pg/profile/carliros" class="icon" ><img src="http://blog.comunidadhaskell.org/mod/profile/icondirect.php?lastcache=1271783869&username=carliros&size=tiny" border="0"  title="Carlos Gomez"  /></a>
</div>

	    </div>
			<p class="strapline">
				June 19, 2009				por <a href="http://blog.comunidadhaskell.org/pg/blog/carliros">Carlos Gomez</a> &nbsp; 
				<!-- display the comments link -->
							    	<a href="http://blog.comunidadhaskell.org/pg/blog/carliros/read/79/irc-channel-haskell">Comentarios (0)</a><br />
			    			</p>
			<!-- display tags -->
				<p class="tags"><a rel="tag" href="http://blog.comunidadhaskell.org/tag/Haskell">Haskell</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/irs">irs</a>, <a rel="tag" href="http://blog.comunidadhaskell.org/tag/chat">chat</a></p>			<div class="clearfloat"></div>
			<div class="blog_post_body">

			<!-- display the actual blog post -->
				<p>Navegando por la Web encontre un Canal IRC.</p>
<p>No sabia que existia un lugar online en donde se puede chatear con otros haskelleros.</p>
<p>Segun ellos, este IRC puede ser usado para aprender mas acerca de haskell, enterarse de nuevas cosas de haskell, porque muchas nuevas cosas primero dice que aparecen en el irc.</p>
<p>Bueno, no quise esperar mucho para unirme.</p>
<p>Para unirte puedes usar cualquier chat que te permita unirte al irc, en lo particular yo use irssi, pero puedes usar pidgin u otro.</p>
<p><strong>apt-get install irssi</strong></p>
<p>luego, &gt;<strong> irssi -c chat.freenode.net -n tunickname<br /></strong></p>
<p>puedes usar cualquier nick que no este repetido actualmente, pero si despues dela primera ves quieres mantenerte con ese nick deberas registrarte, como ?, puedes ver <a href="http://freenode.net/faq.shtml#nicksetup" title="freenode-step-to-register">frenode-register</a></p>
<p>una ves adentro seleccionar el salon al que quieres ingresar, en nuestro caso</p>
<p><strong>/join #haskell</strong></p>
<p>y listo, a chatear con los cuates.</p>
<p>Para mas informacion puedes ver este enlace <a href="http://www.haskell.org/haskellwiki/IRC_channel" title="irc-haskell">irc-haskell</a>, en el cual encontraras otros salones de chat relacionados a haskell.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
			</div><div class="clearfloat"></div>			
			<!-- display edit options if it is the blog post owner -->
			<p class="options">
						</p>
		</div>
		</div>

]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/metadata/606/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 19 Jun 2009 18:57:35 +0200" ><![CDATA[Haskell]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/metadata/605/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 19 Jun 2009 18:57:35 +0200" ><![CDATA[irs]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/metadata/604/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="tags" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 19 Jun 2009 18:57:35 +0200" ><![CDATA[chat]]></metadata>
<metadata uuid="http://blog.comunidadhaskell.org/export/opendd/79/metadata/600/" entity_uuid="http://blog.comunidadhaskell.org/export/opendd/79/" name="comments_on" type="metadata" owner_uuid="http://blog.comunidadhaskell.org/export/opendd/5/" published="Fri, 19 Jun 2009 06:30:35 +0200" ><![CDATA[on]]></metadata>
</odd>