que parece ser la forma más matemática
Los lenguajes funcionales están inspirados en el cálculo lambda . En este campo, los paréntesis no se utilizan para la aplicación de funciones.
También creo que este último estilo es mucho más claro y legible que sin los parens.
La legibilidad está en el ojo del espectador. No estás acostumbrado a leerlo. Es un poco como los operadores matemáticos. Si comprende la asociatividad, solo necesita unos pocos padres para aclarar la estructura de su expresión. A menudo no los necesitas.
El curry también es una buena razón para usar esta convención. En haskell, puede definir lo siguiente:
add :: Int -> Int -> Int
add x y = x + y
x = add 5 6 -- x == 11
f = add 5
y = f 6 -- y == 11
z = ((add 5) 6) -- explicit parentheses; z == 11
Con parens, puede usar dos convenciones: f(5, 6)
(no curry) o f(5)(6)
(curry). La sintaxis de Haskell ayuda a acostumbrarse al concepto de curry. Todavía puede usar una versión sin curry, pero es más doloroso usarla con combinadores
add' :: (Int, Int) -> Int
add' (x, y) = x + y
u = add'(5, 6) -- just like other languages
l = [1, 2, 3]
l1 = map (add 5) l -- [6, 7, 8]
l2 = map (\x -> add'(5, x)) l -- like other languages
Observe cómo la segunda versión lo obliga a registrar x como una variable, y que la subexpresión es una función que toma un número entero y le agrega 5. La versión al curry es mucho más ligera, pero también es considerada por muchos como más legible.
Los programas Haskell hacen un uso extensivo de aplicaciones parciales y combinadores como un medio para definir y componer abstracciones, por lo que este no es un ejemplo de juguete. Una buena interfaz de función será aquella en la que el orden de los parámetros proporcione un uso curioso amigable.
Otro punto: una función sin parámetros debe llamarse con f()
. En Haskell, dado que solo manipula valores evaluados perezosos inmutables, simplemente escribe f
y lo considera como un valor que necesitará realizar algunos cálculos cuando sea necesario. Como su evaluación no tendrá ningún efecto secundario, no tiene sentido tener una notación diferente para la función sin parámetros y su valor devuelto.
También hay otras convenciones para la aplicación de funciones:
- Lisp: (fx) - prefijo con paréntesis externos
- Adelante: xf - postfix
x²
como ejemplo?