<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>programacion-funcional &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/programacion-funcional/</link>
	<description>Feed of posts on WordPress.com tagged "programacion-funcional"</description>
	<pubDate>Sun, 07 Sep 2008 01:36:40 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Lambda en python]]></title>
<link>http://binsd.wordpress.com/?p=145</link>
<pubDate>Thu, 28 Aug 2008 15:29:24 +0000</pubDate>
<dc:creator>arturoeanton</dc:creator>
<guid>http://binsd.wordpress.com/?p=145</guid>
<description><![CDATA[Me gusto mucho la explicación de lambda de la wikipedia:
“El cálculo lambda es un sistema formal]]></description>
<content:encoded><![CDATA[<p>Me gusto mucho la explicación de lambda de la wikipedia:</p>
<blockquote><p>“El cálculo lambda es un sistema formal diseñado para investigar la definición de función, la noción de aplicación de funciones y la recursión. Fue introducido por Alonzo Church y Stephen Kleene en la década de 1930; Church usó el cálculo lambda en 1936 para resolver el Entscheidungsproblem. Puede ser usado para definir de manera limpia y precisa qué es una "función computable". El interrogante de si dos expresiones del lambda cálculo son equivalentes no puede ser resuelto por un algoritmo general. Esta fue la primera pregunta, incluso antes que el problema de la parada, para el cual la indecidibilidad fue probada. El cálculo lambda tiene una gran influencia sobre los lenguajes funcionales, como Lisp, ML y Haskell.<br />
Se puede considerar al cálculo lambda como el más pequeño lenguaje universal de programación. Consiste en una regla de transformación simple (sustitución de variables) y un esquema simple para definir funciones.<br />
El cálculo lambda es universal porque cualquier función computable puede ser expresada y evaluada a través de él. Por lo tanto, es equivalente a las máquinas de Turing. Sin embargo, el cálculo lambda no hace énfasis en el uso de reglas de transformación y no considera las máquinas reales que pueden implementarlo. Se trata de una propuesta más cercana al software que al hardware.”[ http://es.wikipedia.org/wiki/C%C3%A1lculo_Lambda]</p></blockquote>
<p>Lambda es el feacture con el cual podremos ejecutar funciones anónimas. Es decir funciones sin ningún nombre.<br />
La sintaxis de lambda en python es:</p>
<p>lambda :</p>
<pre><a name="lambda">lambda &#60;aParameterList&#62; : &#60;a Python expression using the parameters&#62;
</a></pre>
<p>por ejemplo</p>
<p><a name="lambda">lambda x: x+1</a></p>
<p>Los ejemplos de la entrada de programación funcional con lambda quedarían:</p>
<p><strong>lambda y</strong><strong> map</strong>:</p>
<p>Ejemplo:</p>
<pre style="border:1px solid #d0d0d0;font-family:monospace;font-size:12px;font-weight:bold;color:#00FF00;background-color:#000000;">#!/usr/bin/python
# Nombre de Fichero : map_lambda.py

lt = range(5)
print lt
print map (lambda x:x + 1,lt)
print lt</pre>
<p><strong><br />
</strong><strong>lambda y f</strong><strong>ilter</strong>:</p>
<p>Ejemplo:</p>
<pre style="border:1px solid #d0d0d0;font-family:monospace;font-size:12px;font-weight:bold;color:#00FF00;background-color:#000000;">#!/usr/bin/python
# Nombre de Fichero : filter_lambda.py

lt = range(5)
print lt
print map (lambda x:x in (1,3,6),lt) #como ya sabemos manejar map ;-).
print filter (lambda x:x in (1,3,6),lt)
print lt</pre>
<p><strong>lambda y r</strong><strong>educe:</strong></p>
<p>Ejemplo:</p>
<pre style="border:1px solid #d0d0d0;font-family:monospace;font-size:12px;font-weight:bold;color:#00FF00;background-color:#000000;">#!/usr/bin/python
# Nombre de Fichero : reduce.py

lt = range(5)
lts = ["hola ","como ","estas."]

print " lt -&#62; %s"%lt
print " lts -&#62; %s" %lts 

print " reduce lt  -&#62; %s" %reduce (lambda x,y : x+y,lt)
print " reduce lts -&#62; %s" %reduce (lambda x,y : x+y,lts)</pre>
<p>-</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Programación funcional en python]]></title>
<link>http://binsd.wordpress.com/?p=139</link>
<pubDate>Thu, 28 Aug 2008 01:30:13 +0000</pubDate>
<dc:creator>arturoeanton</dc:creator>
<guid>http://binsd.wordpress.com/?p=139</guid>
<description><![CDATA[Para empezar a entrar en tema podríamos ver la wikipedia
Los programas escritos en un lenguaje func]]></description>
<content:encoded><![CDATA[<p>Para empezar a entrar en tema podríamos ver la wikipedia</p>
<blockquote><p>Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino como funciones puramente matemáticas, en las que se verifican ciertas propiedades como la transparencia referencial (el significado de una expresión depende únicamente del significado de sus subexpresiones), y por tanto, la carencia total de efectos laterales.<br />
Otras características propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteración (lo que obliga en la práctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de funciones recursivas).<br />
Existen dos grandes categorías de lenguajes funcionales: los funcionales puros y los híbridos. La diferencia entre ambos estriba en que los lenguajes funcionales híbridos son menos dogmáticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de instrucciones o la asignación de variables. En contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un lenguaje funcional híbrido.”<br />
[http://es.wikipedia.org/wiki/Programaci%C3%B3n_funcional]</p></blockquote>
<p>Python nos facilita un conjunto de feature  que nos permite darle un enfoque funcional a nuestra programación.  Estos feacture son:</p>
<ul>
<li>map</li>
<li>filter</li>
<li>reduce</li>
<li>lambda</li>
<li>listas por comprensión</li>
</ul>
<p><strong>Map</strong>:</p>
<p>La función “map” es una función de orden superior, que recibe en su primer parámetro una función fx y en su segundo parámetro una lista lt. Y lo que hará simplemente es aplicar la función fx a los elementos de la lista lt.<br />
Ejemplo:</p>
<pre style="border:1px solid #d0d0d0;font-family:monospace;font-size:12px;font-weight:bold;color:#00FF00;background-color:#000000;">#!/usr/bin/python
# Nombre de Fichero : map.py

lt = range(5)
def fx(x):
    return x + 1

print lt
print map (fx,lt)
print lt</pre>
<p><strong><br />
Filter</strong>:</p>
<p>La función “filter” es una función de orden superior, que recibe en su primer parámetro una función fx  que retorne true o false y en su segundo parámetro una lista lt. Y lo que hará simplemente es aplicar la función fx a los elementos de la lista lt y retornar una lista con todos los elementos que dieron trae.</p>
<p>Ejemplo:</p>
<pre style="border:1px solid #d0d0d0;font-family:monospace;font-size:12px;font-weight:bold;color:#00FF00;background-color:#000000;">#!/usr/bin/python
# Nombre de Fichero : filter.py

lt = range(5)
def fx(x):
    return x in (1,3,6)

print lt
print map (fx,lt) #como ya sabemos manejar map
print filter (fx,lt)
print lt</pre>
<p><strong>Reduce:</strong></p>
<p>La función “reduce” es una función de orden superior, que recibe en su primer parámetro una función fx y una lista lt. Pero su funcionamiento es menos evidente que "map" y "filter", ya que lo que devuelve es un solo elemento. Para verlo mas claro veamos el ejemplo.</p>
<p>Ejemplo:</p>
<pre style="border:1px solid #d0d0d0;font-family:monospace;font-size:12px;font-weight:bold;color:#00FF00;background-color:#000000;">#!/usr/bin/python
# Nombre de Fichero : reduce.py

lt = range(5)
lts = ["hola ","como ","estas."]
def sumatoria(x,y):
    return x+y

print " lt -&#62; %s"%lt
print " lts -&#62; %s" %lts 

print " reduce lt  -&#62; %s" %reduce (sumatoria,lt)
print " reduce lts -&#62; %s" %reduce (sumatoria,lts)

print " lt -&#62; %s"%lt
print " lts -&#62; %s" %lts</pre>
<p>En las próximas entradas explicaremos listas por comprensión  y lambda.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Erlang prevalecerá]]></title>
<link>http://ocurrenciashabituales.wordpress.com/?p=231</link>
<pubDate>Mon, 12 May 2008 20:01:53 +0000</pubDate>
<dc:creator>manuelabeledo</dc:creator>
<guid>http://ocurrenciashabituales.wordpress.com/?p=231</guid>
<description><![CDATA[Buscando información sobre Rails y Django, me he topado con un artículo que ilustra los puntos dé]]></description>
<content:encoded><![CDATA[<p><img class="alignright" style="float:right;" src="http://www.erlang.org/images/erlang.gif" alt="" width="114" height="96" />Buscando información sobre Rails y Django, me he topado con un artículo que ilustra los puntos débiles del marco de desarrollo web de moda e introduce lo que podría ser el nuevo <em>hype</em> de la programación o, por fin, una alternativa a los grandes del sector: <a title="Permalink of " href="http://blog.bwtaylor.com/2007/09/23/ruby_meet_erlang">Rails, the 15 minutes is Almost Up. Meet Erlang</a>.</p>
<p><a href="http://www.erlang.org/">Erlang</a> es un lenguaje de alto nivel, funcional, de asignación única y dinámico, como Ruby. Ha sido desarrollado en los laboratorios de Ericsson partiendo de tres premisas fundamentales: tolerancia a fallos, concurrencia y sencillez. Las aplicaciones Erlang pueden correr sobre una máquina virtual o ser traducidas a código nativo gracias a un compilador de alto rendimiento llamado, irónicamente, HiPE.</p>
<p>A pesar de su origen, desde 1998 tanto la implementación del lenguaje como el conjunto de bibliotecas OTP son libres bajo la licencia EPL.</p>
<p>Total, que tenemos una plataforma peculiar cuya liberación cumple diez años. ¿Por qué es especial?</p>
<p><!--more--></p>
<p>Pues por muchos motivos. Pero la expectación creada alrededor de Erlang tiene poco que ver con el lenguaje en si. Al fin y al cabo, hemos tenido una década para evaluarlo. Lo verdaderamente importante es el momento tecnológico que estamos viviendo. El paralelismo es ya el modelo indiscutible para alcanzar el máximo rendimiento, la guerra de los gigahertzios hace tiempo que terminó y la nueva guerra, la de los núcleos, está comenzando.</p>
<p>El soporte a la programación concurrente en los lenguajes tradicionales sigue siendo primitivo, muy propenso a errores. En este campo, Erlang es el rey. Puede crear y manejar cientos de miles de procesos sin despeinarse, incluso millones, evitándole al programador dolores de cabeza. El mismo lenguaje evita un montón de fallos gracias a la evaluación estricta o la asignación única de variables. Y si algo falla, ¡no hay problema! Erlang permite el cambio en caliente del código.</p>
<p>El lenguaje no viene solo. Trae bajo el brazo las ya mencionadas bibliotecas OTP (Open Telecom Platform), una metodología de programación (programación orientada a concurrencia), guías de diseño y patrones. Todo está probado y corriendo. De hecho, es muy probable que si realizas una llamada a través de tu teléfono móvil, alguno de los componentes que la harán posible esté construido sobre Erlang.</p>
<p>Más de uno se preguntará por qué coño no estamos todos alabando al dios Erlang y programando aplicaciones en este lenguaje como locos. Bueno, digamos que por muy bueno que sea, tiene algunas <em>peculiaridades</em> insalvables.</p>
<p>Para empezar, nos ha costado más de diez años adoptar el paradigma de objetos y no existe una disposición clara a cambiar de nuevo. Hemos pasado de los lenguajes estructurados a los orientados a objetos con sumo cuidado. Una muestra de ello es que C++ es casi una extensión de C y Java está inspirado en C++. ¿Y las metodologías? ¿Tendríamos que adaptar las herramientas de ingeniería de software?</p>
<p>Erlang da miedo porque no está respaldado por un paradigma y un lenguaje generalistas. Java llegó con la vitola de ser un C++ <em>mejorado</em>, lo cual demostró tener mucho peso en la comunidad de programadores. Era más sencillo, menos propenso a errores y tenía una extensísima biblioteca de clases. Sin embargo, ¿podríamos vender un <a href="http://es.wikipedia.org/wiki/Scheme">Scheme</a> <em>mejorado</em>? ¿Un <a href="http://es.wikipedia.org/wiki/Lisp">Lisp</a> <em>mejorado</em>? No es plausible. La industria está introduciendo lentamente los lenguajes funcionales como complemento de otros, como <a href="http://es.wikipedia.org/wiki/LINQ">Linq</a>, y las instituciones educativas ya les han hecho un hueco. A mí me enseñaron <a href="http://es.wikipedia.org/wiki/Caml">Caml</a>, por ejemplo.</p>
<p>Y es que ya no estamos hablando de evolucionar desde un lenguaje estructurado a uno orientado a objetos. Este paso es mucho mayor. Hablamos de la enorme dificultad de cambiar los lenguajes procedimentales por lenguajes declarativos, lo que es paradójico pues un lenguaje declarativo debería tener una sintaxis más <em>natural</em> que uno procedimental.</p>
<p>Sí y no. Los que llevamos unos añitos en esto ya nos hemos adaptado a la máquina. Suena fuerte, ¿verdad? Modelamos en alto nivel y programamos en bajo nivel. Por muchas filigranas que tengan los lenguajes, por mucho que se haya escrito sobre esa facilidad a la hora de proyectar un objeto sobre algo del mundo real, todavía estamos obligados a pensar en qué queremos hacer y cómo queremos adaptar esa idea al modo de trabajar de la máquina.</p>
<p>Y resulta que los lenguajes funcionales no hacen eso. Intenta describir un proceso tradicional con funciones matemáticas y entenderás de qué hablo.</p>
<p>Pero no es tan complicado como parece. Las aplicaciones construidas con lenguajes funcionales suelen tener un código más limpio y elegante... Pero <em>diferente</em>. Y eso, claro está, es un hándicap.</p>
<p>Añadamos la orientación a concurrencia de Erlang y ya la hemos liado. Hay gente que se hace la picha un lío hasta que se da cuenta de que la primera A de Ajax es de asíncrono, ¡imaginaos qué ocurriría con una operación que cree dos docenas de procesos! Ojo, el lenguaje que nos ocupa hace que todo lo referente a la creación, destrucción, manejo y comunicación entre procesos sea insultantemente sencillo. Pero sigue siendo <em>diferente</em>.</p>
<p>Entonces, ¿a qué viene el título? ¿Por qué empezar poniendo los dientes largos a todo el mundo para caer en una aparente decepción? Bueno, Erlang tiene ahora mismo un nicho de mercado muy definido y casi intocable en aplicaciones destinadas a concurrencia o alta disponibilidad. Simplemente, es <em>mejor</em> que la competencia, así que podemos predecir una larga vida útil. Y si mañana alguien piensa que sería interesante incorporar al negocio un lenguaje que evite muchos de los errores de programación típicos y mejore la productividad y el rendimiento en los nuevos entornos multinúcleo, a costa de <a href="http://www.erlang.org/course/course.html">reciclarse en cuatro días</a>, pues quién sabe, quizá lo que hoy es todavía una curiosidad alcance un buen lugar en el mercado.</p>
<p>Sea como fuere, estará ahí muchos, muchos años, tras el funcionamiento de tu teléfono, tu televisión o el último satélite lanzado al espacio.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[NixOS, GNU/Linux funcional]]></title>
<link>http://ocurrenciashabituales.wordpress.com/?p=193</link>
<pubDate>Sat, 12 Apr 2008 19:28:35 +0000</pubDate>
<dc:creator>manuelabeledo</dc:creator>
<guid>http://ocurrenciashabituales.wordpress.com/?p=193</guid>
<description><![CDATA[La última moda en lenguajes de programación viene de la década de los cincuenta y se llama progra]]></description>
<content:encoded><![CDATA[<p>La última moda en lenguajes de programación viene de <a href="http://es.wikipedia.org/wiki/Lisp">la década de los cincuenta</a> y se llama <a href="http://es.wikipedia.org/wiki/Programaci%C3%B3n_funcional">programación funcional</a>. Este es un paradigma basado en las funciones matemáticas que, en teoría, evitaría un montón de errores y ahorraría tiempo de depuración.</p>
<p><a href="http://people.cs.uu.nl/andres/NixOS.html">NixOS</a> pretende trasladar este concepto a las distribuciones de GNU/Linux. De entrada no me parece un sistema que cualquier usuario pueda utilizar. Estamos acostumbrados a la imperatividad, a ejecutar una aplicación y suponer el resultado.</p>
<p>Un sistema funcional sería más rígido aunque también más elegante y tolerante a fallos.</p>
<p>Ahora toca leerse el <a href="http://people.cs.uu.nl/andres/NixOS.pdf">artículo técnico</a> y pensar hasta dónde puede llegar.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Programación Funcional on a Mac]]></title>
<link>http://hexmac.wordpress.com/?p=36</link>
<pubDate>Thu, 14 Feb 2008 19:01:58 +0000</pubDate>
<dc:creator>hexmar</dc:creator>
<guid>http://hexmac.wordpress.com/?p=36</guid>
<description><![CDATA[
Con la próxima llegada del examen de &#8220;Programación Funcional&#8221;, tengo la necesidad, au]]></description>
<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/hexmar/2264786723/" target="_blank"><img src="http://farm3.static.flickr.com/2012/2264786723_0beb2fae8b.jpg?v=0" alt="" width="424" height="229" align="middle" /></a></p>
<p>Con la próxima llegada del examen de "Programación Funcional", tengo la necesidad, aunque a pequeña escala, de usar ese magnífico, moderno y completo lenguaje que es <a href="http://www.haskell.org/" target="_blank">Haskell</a>. Hasta ayer no quería complicarme la vida y directamente ejecutaba el "famoso" <a href="http://www.haskell.org/haskellwiki/WinHugs" target="_blank">Winhugs</a>, vía Parallels y Win XP. Pero me estaba hartando de tener que cepillarme la mitad de la batería de "mi querido MacBook Pro" cada vez que tenga que probar cualquier "caquiPrograma" de cualquier ejercicio; eso y el "perreo" que me entra en el cuerpo en época de exámenes... Costar no cuesta mucho, pero lo cierto es que instalarlo en MacOS X, de forma nativa no es tan fácil como de hecho lo es en Windows, esto lo tengo que reconocer, y que además las instrucciones que hay para Mac en la página oficial de Hugs están un poco desactualizadas, así que explicaré como hacerlo de manera rápida y sencilla en Leopard.</p>
<p><!--more--></p>
<p>Lo primero que tenemos que hacer es instalarnos las "<a href="http://www.apple.com/es/macosx/developer/" target="_blank">Developer Tools</a>", estas herramientas de desarrollo ocupan alrededor de 1GB, se encuentran en el DVD de instalación del Mac, o el de Leopard si como yo lo habéis instalado luego. También se puede descargar de <a href="http://developer.apple.com/leopard/devcenter/" target="_blank">aquí</a>.Una vez instaladas las "Tools" procedemos a instalar los "<a href="http://darwinports.com/" target="_blank">Darwin Ports</a>", descargamos un pequeño <a href="http://darwinports.com/download" target="_blank">paquete de instalación</a> que nos instala en unos minutos dichos puertos. Cuando acabemos, abrimos una ventana de terminal y escribimos los siguiente:</p>
<p><code>% sudo port -d selfupdate<br />
Password:</code></p>
<p>Cuando nos pide password, introducimos la contraseña del administrador del Mac donde lo estemos haciendo. Una vez hecho esto, de nuevo en Terminal, escribimos lo siguiente, eso sí, con la conexión a Internet activa, pues descargara los paquetes que necesite para proceder a la instalación:</p>
<p><code>%  cd /opt/local/bin/<br />
%  sudo port install hugs98<br />
Password:</code></p>
<p>Aquí es donde el manual que yo seguí estaba el error, pues la ruta donde aparece el ejecutable "port" es la que he puesto arriba. Tardara un poco, por las descargas y demás, no hay que cerrar la ventana de terminal hasta que no acabe. Una vez termine, listo, ya estaría instalado.Lo siguiente que podemos hacer, si queremos automatizar un poco la apertura del Hugs, es crearnos un AppleScript, para ello abrimos el "<a href="http://www.apple.com/es/macosx/features/300.html#applescript" target="_blank">Editor de Scripts</a>", y en la ventana que aparece escribimos lo siguiente:</p>
<p><code><br />
tell application "Terminal"<br />
do script "/opt/local/bin/hugs"<br />
end tell</code></p>
<p>No sé que pasa con las comillas que las cambia por tipográficas, si hacéis copy paste cambiad las comillas por las de encima del 2 ;)</p>
<p>Guardamos por fin el script, como aplicación, y ahora sí que ya está, cada vez que ejecutéis este script se os abrirá una ventana de terminal con el Hugs activo.</p>
<p>Vía: <a href="http://hugs98.darwinports.com/" target="_blank">Hugs98 en Darwin Ports </a></p>
]]></content:encoded>
</item>

</channel>
</rss>
