You are on page 1of 6

INSTITUTO TECNOLGICO DE ESTUDIOS SUPERIORES DE ZAMORA

MATERIA: PROGRAMACION LOGICA Y FUNCIONAL UNIDAD III

ACTIVIDAD: INVESTIGACION DE HASKELL

ALUMNOS: OMAR CHVEZ RAMREZ

CARRERA: INGENIERA EN SISTEMAS COMPUTACIONALES

GRADO: 7 SEMESTRE

GRUPO: B 22 de noviembre de 2013

Funciones de orden superior


Las funciones de Haskell pueden tomar funciones como parmetros y devolver funciones como resultado.

Funciones currificadas
Oficialmente cada funcin de Haskell solo puede tomar un parmetro. As que Cmo es posible que hayamos definido y usado varias funciones que toman ms de un parmetro? Bueno Es un buen truco! Todas las funciones que hemos usado hasta el momento y aceptaban ms de un parmetro han sido funciones currificadas.

Orden superior en su orden


Las funciones pueden tomar funciones como parmetros y tambin devolver funciones.

Asociaciones y filtros
map toma una funcin y una lista y aplica esa funcin a cada elemento de esa lista, produciendo una nueva lista.

Lambdas
Las lambdas son funciones annimas que suelen ser usadas cuando necesitamos una funcin una sola vez. Normalmente creamos funciones lambda con el nico propsito de pasarlas a funciones de orden superior. Para crear una lambda escribimos un \ (Porque tiene un cierto parecido con la letra griega lambda si le echas mucha imaginacin) y luego los parmetros separados por espacios. Luego escribimos una -> y luego el cuerpo de la funcin. Normalmente las envolvemos con parntesis ya que de otra forma se extenderan al resto de la lnea. Al igual que las funciones normales, las lambdas pueden tomar cualquier nmero de parmetros.

Pliegues
Son una especie de funcin map, solo que reducen la lista a un solo valor. Un pliegue toma una funcin binaria, un valor inicial (a m me gusta llamarlo el acumulador) y una lista que plegar. La funcin binaria toma dos parmetros por s misma. La funcin binaria es llamada con el acumulador y el primer (o ltimo) elemento y produce un nuevo acumulador. Luego, la funcin binaria se vuelve a llamar junto al nuevo acumulador y al nuevo primer (o ltimo) elemento de la lista, y as sucesivamente. Cuando se ha recorrido la lista completa, solo permanece un acumulador, que es el valor al que se ha reducido la lista. Los pliegues se pueden utilizar para implementar cualquier funcin que recorra una lista, elemento a elemento, y luego devuelvan un valor. Siempre que quieras recorrer una lista y devolver un valor, hay posibilidades de utilizar un pliegue.

Aplicacin de funciones con $


Pero qu...? Para qu queremos un operador tan intil? Es simplemente la aplicacin de una funcin! Bueno, casi, pero no solo eso. Mientras que la aplicacin de funciones normal (un espacio

entre dos cosas) tiene un alto orden de precedencia, la funcin $ tiene el orden de precedencia ms bajo. La aplicacin de funciones con el espacio es asociativa a izquierdas (as que f a b c es lo mismo que ((f a) b) c), la aplicacin de funciones con $ es asociativa a derechas. Eso est muy bien, pero De qu nos sirve esto? Bsicamente es una funcin de conveniencia que utilizamos para no tener que escribir muchos parntesis. Considera la expresin sum (map sqrt [1..130]). Gracias a que $ tiene un bajo orden de precedencia podemos escribir es misma expresin como sum $ map sqrt [1..130].

Composicin de funciones
En matemticas la composicin de funciones est definida como: , que significa que al componer dos funciones se crea una nueva que, cuando se llama con un parmetro, digamos x, es equivalente a llamar a g con x y luego llamar a f con el resultado anterior. En Haskell la composicin de funciones es prcticamente lo mismo. Realizamos la composicin de funciones con la funcin .. Uno de los usos de la composicin de funciones es el de crear funciones al vuelo para ser pasadas a otras funciones. Claro, puedes usar lambdas pero muchas veces la composicin de funciones es ms clara y concisa. Digamos que tenemos una lista de nmeros y queremos convertirlos todos en negativos. Una forma de hacerlo sera obteniendo primero el nmero absoluto y luego negndolo

Inferencia de tipos y clases


Al contrario que Java o C, Haskell posee inferencia de tipos. Si escribimos un nmero, no tenemos que especificar que eso es un nmero. Haskell puede deducirlo l solo, as que no tenemos que escribir explcitamente los tipos de nuestras funciones o expresiones para conseguir resultados. Ya hemos cubierto parte de las bases de Haskell con muy poco conocimiento de los tipos. Sin embargo, entender el sistema de tipos es una parte muy importante para dominar Haskell. Un tipo es como una etiqueta que posee toda expresin. Esta etiqueta nos dice a qu categora de cosas se ajusta la expresin. La expresin True es un booleano, "Hello" es una cadena, etc. Tipos ms comunes:

Int representa enteros. Se utiliza para representar nmero enteros, por lo que 7 puede ser un Int pero 7.2 no puede. Int est acotado, lo que significa que tiene un valor mximo y un valor mnimo. Normalmente en mquinas de 32bits el valor mximo de Int es 2147483647 y el mnimo -2147483648. Integer representa... esto... enteros tambin. La diferencia es que no estn acotados as que pueden representar nmeros muy grandes. Sin embargo, Int es ms eficiente. Float es un nmero real en coma flotante de simple precisin. Double es un nmero real en coma flotante de... Doble precisin!

Bool es el tipo booleano. Solo puede tener dos valores: True o False. Char representa un carcter. Se define rodeado por comillas simples. Una lista de caracteres es una cadena. Las tuplas tambin poseen tipos pero dependen de su longitud y del tipo de sus componentes, as que tericamente existe una infinidad de tipos de tuplas y eso son demasiados tipos como para cubrirlos en esta gua. La tupla vaca es tambin un tipo () el cual solo puede contener un valor: ().

Variables de tipo
Qu es a? Es un tipo? Si recuerdas antes dijimos que los tipos deben comenzar con maysculas, as que no puede ser exactamente un tipo. Como no comienza con una mayscula en realidad es una variable de tipo. Esto significa que a puede ser cualquier tipo. Es parecido a los tipos genricos de otros lenguajes, solo que en Haskell son mucho ms potentes ya que nos permite definir fcilmente funciones muy generales siempre que no hagamos ningn uso especfico del tipo en cuestin. Las funciones que tienen variables de tipos son llamadas funciones polimrficas. La declaracin de tipo head representa una funcin que toma una lista de cualquier tipo y devuelve un elemento de ese mismo tipo. Aunque las variables de tipo pueden tener nombres ms largos de un solo carcter, normalmente les damos nombres como a, b, c, d, etc. fst toma una dupla que contiene dos tipos y devuelve un elemento del mismo tipo que el primer componente de la dupla. Ese es el porqu de que podamos usar fst con duplas que contengan cualquier combinacin de tipos. Ten en cuenta que solo porque a y b son diferentes variables de tipo no tienen por qu ser diferentes tipos. Simplemente representa que el primer componente y el valor que devuelve la funcin son del mismo tipo.

Clases de tipo
Las clases de tipos son una especie de interfaz que define algn tipo de comportamiento. Si un tipo es miembro de una clase de tipos, significa que ese tipo soporta e implementa el comportamiento que define la clase de tipos. La gente que viene de lenguajes orientados a objetos es propensa a confundir las clases de tipos porque piensan que son como las clases en los lenguajes orientados a objetos. Bien, pues no lo son. Una aproximacin ms adecuada sera pensar que son como las interfaces de Java, o los protocolos de Objective-C, pero mejor. Algunas clases de tipos bsicas son:

Eq es utilizada por los tipos que soportan comparaciones por igualdad. Los miembros de esta clase implementan las funciones == o /= en algn lugar de su definicin. Todos los tipos que mencionamos anteriormente forman parte de la clase Eq exceptuando las funciones, as que podemos realizar comparaciones de igualdad sobre ellos. Ord es para tipos que poseen algn orden.

Los miembros de Show pueden ser representados por cadenas. Todos los tipos que hemos visto excepto las funciones forman parte de Show. la funcin ms utilizada que trabaja con esta clase de tipos es la funcin show. Toma un valor de un tipo que pertenezca a la clase Show y lo representa como una cadena de texto. Read es como la clase de tipos opuesta a Show. La funcin read toma una cadena y devuelve un valor del tipo que es miembro de Read. Los miembros de la clase Enum son tipos secuencialmente ordenados, es decir, pueden ser enumerados. La principal ventaja de la clase de tipos Enum es que podemos usar los miembros en las listas aritmticas. Tambin tienen definidos los sucesores y predecesores, por lo que podemos usar las funciones succ y pred. Los tipos de esta clase son: (), Bool, Char, Ordering, Int, Integer, Float y Double. Los miembros de Bounded poseen lmites inferiores y superiores, es decir estn acotados. minBound y maxBound son interesantes ya que tienen el tipo (Bounded a) => a. Es decir, son constantes polimrficas. Todas las tuplas son tambin Bounded si sus componentes los son tambin. Num es la clase de tipos numricos. Sus miembros tienen la propiedad de poder comportarse como nmeros. Vamos a examinar el tipo de un nmero. Integral es tambin una clase de tipos numrica. Num incluye todos los nmeros, incluyendo nmeros reales y enteros. Integral nicamente incluye nmeros enteros. Int e Integer son miembros de esta clase. Floating incluye nicamente nmeros en coma flotante, es decir Float y Double.

Evaluacin Perezosa (Lazy)


Los lenguajes tradicionales, evalan todos los argumentos de una funcin antes de conocer si stos sern utilizados. Dicha tcnica de evaluacin se conoce como evaluacin ansiosa (eager evaluation) porque evala todos los argumentos de una funcin antes de conocer si son necesarios. Por otra parte, en ciertos lenguajes funcionales se utiliza evaluacin perezosa (lazy evaluation) que consiste en no evaluar un argumento hasta que no se necesita. Haskell, Miranda y Clean son perezosos, mientras que LISP, SML, Erlang y Scheme son estrictos. Uno de los beneficios de la evaluacin perezosa consiste en la posibilidad de manipular estructuras de datos 'infinitas'. Evidentemente, no es posible construir o almacenar un objeto infinito en su totalidad. Sin embargo, gracias a la evaluacin perezosa se puede construir objetos potencialmente infinitos pieza a pieza segn las necesidades de evaluacin.

Bibliografa:
http://aprendehaskell.es/content/OrdenSuperior.html http://aprendehaskell.es/content/Tipos.html

Paradigmas de programacin, Haskell un lenguaje de programacin funcional; Castillo, Julio Javier

You might also like