qui semble être le moyen le plus mathématique
les langages fonctionnels sont inspirés du lambda calcul . Dans ce champ, les parenthèses ne sont pas utilisées pour l’application de fonctions.
Je pense aussi que ce dernier style est beaucoup plus clair et lisible que sans les parens.
La lisibilité est dans l'oeil du spectateur. Vous n'êtes pas habitué à le lire. C'est un peu comme les opérateurs mathématiques. Si vous comprenez l'associativité, il vous suffit de quelques paragraphes pour clarifier la structure de votre expression. Souvent, vous n'en avez pas besoin.
Le curry est aussi une bonne raison d’utiliser cette convention. Dans haskell, vous pouvez définir les éléments suivants:
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
Avec parens, vous pouvez utiliser deux conventions: f(5, 6)
(non curry) ou f(5)(6)
(curry). La syntaxe haskell aide à s’habituer au concept de currying. Vous pouvez toujours utiliser une version sans curry, mais il est plus pénible de l'utiliser avec des combinateurs.
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
Remarquez comment la deuxième version vous oblige à enregistrer x en tant que variable et que la sous-expression est une fonction qui prend un entier et lui ajoute 5? La version au curry est beaucoup plus légère, mais est également considérée par beaucoup comme plus lisible.
Les programmes Haskell utilisent beaucoup les applications partielles et les combinateurs pour définir et composer les abstractions. Ce n’est donc pas un exemple. Une bonne interface fonctionnelle sera celle où l'ordre des paramètres fournit une utilisation conviviale au curry.
Autre point: une fonction sans paramètre doit être appelée avec f()
. Dans haskell, puisque vous ne manipulez que des valeurs évaluées immuables, vous écrivez f
et vous le considérez comme une valeur qui devra effectuer des calculs si nécessaire. Étant donné que son évaluation n'aura aucun effet secondaire, il ne sert à rien d'avoir une notation différente pour la fonction sans paramètre et sa valeur renvoyée.
Il existe également d'autres conventions pour l'application de fonctions:
- Lisp: (fx) - préfixe avec des parenthèses externes
- Pour: xf - postfix