Haskell Language
Función de sintaxis de llamada.
Buscar..
Introducción
La sintaxis de llamada a la función de Haskell, explicada con comparaciones a lenguajes de estilo C, donde corresponda. Esto está dirigido a personas que vienen a Haskell desde un fondo en lenguajes estilo C.
Observaciones
En general, la regla para convertir una llamada de función de estilo C a Haskell, en cualquier contexto (asignación, devolución o incrustada en otra llamada), es reemplazar las comas en la lista de argumentos de estilo C con espacios en blanco y mover la apertura los paréntesis de la llamada de estilo C para contener el nombre de la función y sus parámetros.
Si alguna expresión está envuelta por completo entre paréntesis, estos pares (externos) de paréntesis se pueden eliminar para facilitar la lectura, ya que no afectan el significado de la expresión.
Existen otras circunstancias en las que se pueden eliminar los paréntesis, pero esto solo afecta la legibilidad y la capacidad de mantenimiento.
Paréntesis en una función básica llamada
Para una llamada de función de estilo C, por ejemplo
plus(a, b); // Parentheses surrounding only the arguments, comma separated
Entonces el código Haskell equivalente será
(plus a b) -- Parentheses surrounding the function and the arguments, no commas
En Haskell, los paréntesis no se requieren explícitamente para la aplicación de funciones, y solo se usan para desambiguar expresiones, como en matemáticas; por lo tanto, en los casos en que los corchetes rodean todo el texto de la expresión, los paréntesis en realidad no son necesarios, y lo siguiente también es equivalente:
plus a b -- no parentheses are needed here!
Es importante recordar que mientras que en los lenguajes de estilo C, la función
Paréntesis en llamadas a funciones incrustadas
En el ejemplo anterior, no terminamos necesitando los paréntesis, porque no afectaron el significado de la declaración. Sin embargo, a menudo son necesarios en expresiones más complejas, como la de abajo.
Cía:
plus(a, take(b, c));
En Haskell esto se convierte en:
(plus a (take b c))
-- or equivalently, omitting the outermost parentheses
plus a (take b c)
Tenga en cuenta que esto no es equivalente a:
plus a take b c -- Not what we want!
Uno podría pensar que debido a que el compilador sabe que take
es una función, que sería capaz de saber que desea aplicar a los argumentos b
y c
, y pasar su resultado a plus
.
Sin embargo, en Haskell, las funciones a menudo toman otras funciones como argumentos, y se hace poca distinción real entre funciones y otros valores; y así el compilador no puede asumir su intención simplemente porque take
es una función.
Y así, el último ejemplo es análogo a la siguiente llamada a la función C:
plus(a, take, b, c); // Not what we want!
Solicitud parcial - Parte 1
En Haskell, las funciones se pueden aplicar parcialmente; podemos pensar que todas las funciones toman un solo argumento y devuelven una función modificada para la cual ese argumento es constante. Para ilustrar esto, podemos agrupar las funciones de la siguiente manera:
(((plus) 1) 2)
Aquí, la función (plus)
se aplica a 1
da como resultado la función ((plus) 1)
, que se aplica a 2
, y se obtiene la función (((plus) 1) 2)
. Debido a que plus 1 2
es una función que no toma argumentos, puede considerarlo un valor simple; sin embargo, en Haskell, hay poca distinción entre funciones y valores.
Para entrar en más detalles, la función plus
es una función que agrega sus argumentos.
La función plus 1
es una función que agrega 1
a su argumento.
La función plus 1 2
es una función que suma 1
a 2
, que siempre es el valor 3
.
Aplicación parcial - Parte 2
Como otro ejemplo, tenemos el map
funciones, que toma una función y una lista de valores, y aplica la función a cada valor de la lista:
map :: (a -> b) -> [a] -> [b]
Digamos que queremos incrementar cada valor en una lista. Puede decidir definir su propia función, que agrega una a su argumento, y map
esa función a su lista
addOne x = plus 1 x
map addOne [1,2,3]
pero si tiene otra mirada a la definición de addOne
, con paréntesis agregados para enfatizar:
(addOne) x = ((plus) 1) x
La función addOne
, cuando se aplica a cualquier valor x
, es la misma que la función parcialmente aplicada plus 1
aplicada a x
. Esto significa que las funciones addOne
y plus 1
son idénticas, y podemos evitar definir una nueva función simplemente reemplazando addOne
con plus 1
, recordando usar paréntesis para aislar plus 1
como una subexpresión:
map (plus 1) [1,2,3]