Buscar..


Observaciones

Vamos a aclarar algunos conceptos erróneos que los principiantes pueden hacer.

Es posible que haya encontrado funciones tales como:

max :: (Ord a) => a -> a -> a  
max m n  
  | m >= n = m  
  | otherwise = n  

Los principiantes típicamente verán max :: (Ord a) => a -> a -> a como max :: (Ord a) => a -> a -> a función que toma dos argumentos (valores) de tipo a y devuelve un valor de tipo a . Sin embargo, lo que realmente está sucediendo es que max está tomando un argumento de tipo a y devolviendo una función de tipo a -> a . Esta función toma un argumento de tipo a y devuelve un valor final de tipo a .

De hecho, max puede escribirse como max :: (Ord a) => a -> (a -> a)

Considere la firma del tipo de max :

Prelude> :t max  
max :: Ord a => a -> a -> a  

Prelude> :t (max 75)  
(max 75) :: (Num a, Ord a) => a -> a  

Prelude> :t (max "Fury Road")  
(max "Fury Road") :: [Char] -> [Char]  

Prelude> :t (max "Fury Road" "Furiosa")  
(max "Fury Road" "Furiosa") :: [Char]  

max 75 y max "Fury Road" puede que no parezcan funciones, pero en realidad lo son.

La confusión se deriva del hecho de que en matemáticas y en muchos otros lenguajes de programación comunes, se nos permite tener funciones que toman múltiples argumentos. Sin embargo, en Haskell, las funciones solo pueden tomar un argumento y pueden devolver valores como a , o funciones como a -> a .

Función de adición parcialmente aplicada

Podemos usar la aplicación parcial para "bloquear" el primer argumento. Después de aplicar un argumento, nos quedamos con una función que espera un argumento más antes de devolver el resultado.

(+) :: Int -> Int -> Int

addOne :: Int -> Int
addOne = (+) 1

Luego podemos usar addOne para agregar uno a un Int .

> addOne 5
6
> map addOne [1,2,3]
[2,3,4]

Devolviendo una Función Parcialmente Aplicada

Devolver funciones parcialmente aplicadas es una técnica para escribir código conciso.

add :: Int -> Int -> Int
add x = (+x)

add 5 2

En este ejemplo (+ x) es una función parcialmente aplicada. Tenga en cuenta que el segundo parámetro de la función de adición no necesita ser especificado en la definición de la función.

El resultado de llamar a add 5 2 es siete.

Secciones

La sección es una forma concisa de aplicar parcialmente argumentos a operadores de infijo.

Por ejemplo, si queremos escribir una función que agregue "ing" al final de una palabra, podemos usar una sección para definir sucintamente una función.

> (++ "ing") "laugh"
"laughing"

Observe cómo hemos aplicado parcialmente el segundo argumento. Normalmente, solo podemos aplicar parcialmente los argumentos en el orden especificado.

También podemos usar la sección izquierda para aplicar parcialmente el primer argumento.

> ("re" ++) "do"
"redo"

Podríamos escribir esto de manera equivalente usando la aplicación parcial de prefijo normal:

> ((++) "re") "do"
"redo"

Una nota sobre la resta

Los principiantes a menudo incorrectamente seccionan negación

> map (-1) [1,2,3]
***error: Could not deduce...

Esto no funciona, ya que -1 se analiza como el literal -1 lugar del operador seccionado - aplicado a 1 . La función subtract existe para evitar este problema.

> map (subtract 1) [1,2,3]
[0,1,2]


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow