Habilidades De Pensamiento Y Funciones Básicas Del Cerebro
Enviado por d13g0 • 24 de Abril de 2013 • 1.132 Palabras (5 Páginas) • 766 Visitas
Las funciones de Haskell pueden tomar funciones como parámetros y devolver funciones como resultado. Una función que hace ambas cosas o alguna de ellas se llama función de orden superior. Las funciones de orden superior no son simplemente una parte más de Haskell, ellas mismas representan la experiencia de programar en Haskell. Aparecen cuando quieres definir cálculos definiendo cosas como son en lugar de definir los pasos de cambio de algún estado o algún bucle, las funciones de orden superior son indispensables. Son realmente una forma muy potente de resolver problemas y de pensar acerca de los programas.
Funciones currificadas
Sin comentarios
Oficialmente cada función de Haskell solo puede tomar un parámetro. Así que ¿Como es posible que hayamos definido y usado varias funciones que toman mas de un parámetro? Bueno ¡Es un buen truco! Todas las funciones que hemos usado hasta el momento y aceptaban más de un parámetro han sido funciones currificadas ¿Qué significa esto? Lo entenderás mejor con un ejemplo. Vamos a usar a nuestro buen amigo, la función max. Parece que toma dos parámetro y devuelve aquél que es mayor. Al aplicar max 4 5 primero se crea una función que toma un solo parámetro y devuelve 4 o el parámetro, dependiendo de cual sea mayor. Luego, 5 es aplicado a esa función y esta produce el resultado deseado. Esto suena un poco complicado pero en realidad es un concepto muy útil. Las siguientes dos llamadas son equivalentes:
ghci> max 4 5
5
ghci> (max 4) 5
5
El poner un espacio entre dos cosas es sencillamente aplicar una función. El espacio es una especie de operador y tiene el orden de preferencia mayor. Vamos a examinar el tipo de max. Es max :: (Ord a) => a -> a -> a. Esto también puede ser escrito como max :: (Ord a) => a -> (a -> a). Y también puede leerse como: max toma un a y devuelve (eso es ->) una función que toma un a y devuelve un a. Ese es el porqué el tipo devuelto y los parámetros de la función están separados solamente por flechas.
¿Y cómo nos beneficia esto? En pocas palabras, si llamamos a una función con parámetros de menos obtenemos una función parcialmente aplicada, es decir una función que toma tantos parámetros como le falte. Utilizar la aplicación parcial de funciones (o llamar a las funciones con menos parámetros) es una forma sencilla de crear funciones al vuelo de forma que podamos pasarlas como parámetros a otras funciones o dotarlas con algunos datos.
Échale un vistazo a esta función ofensivamente simple.
multThree :: (Num a) => a -> a -> a -> a
multThree x y z = x * y * z
¿Qué es lo que realmente pasa cuando realizamos multThree 3 5 9 o ((multThree 3) 5) 9? Primero, 3 es aplicado a multThree ya que está separado por un espacio. Esto crea una función que toma un parámetro y devuelve una función. Luego 5 es aplicado a está, de forma que se creará una función que toma un parámetro y lo multiplica por 15. 9 es aplicado a esa función y el resultado es 135 o algo similar. Recuerda que el tipo de esta función también podría escribirse como multThree :: (Num a) => a -> (a -> (a -> a)). Lo que está antes del -> es el parámetro que toma la función y lo que hay después es lo que devuelve. Así que nuestra función toma un a y devuelve una función con un tipo (Num a) => a -> (a -> a). De forma similar, esta función toma una a y devuelve
...