which seems to be the more mathematical way
le lingue funzionali sono ispirate al calcolo lambda . In questo campo, le parentesi non vengono utilizzate per l'applicazione della funzione.
I also think that the latter style is much more clear and readable than without the parens.
La leggibilità è negli occhi di chi guarda. Non sei abituato a leggerlo. È un po 'come operatori matematici. Se comprendi l'associatività, hai bisogno di pochi parens per chiarire la struttura della tua espressione. Spesso non ne hai bisogno.
Il currying è anche una buona ragione per usare questa convenzione. In haskell, puoi definire quanto segue:
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 i parents, potresti usare due convenzioni: f(5, 6)
(non al curry) o f(5)(6)
(al curry). La sintassi haskell aiuta ad abituarsi al concetto di curriculum. Puoi ancora usare una versione non curata, ma è più doloroso usarla con i combinatori
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
Si noti come la seconda versione impone di registrare x come variabile e che la sottoespressione è una funzione che prende un intero e ne aggiunge 5? La versione al curry è molto più leggera, ma anche considerata da molti più leggibile.
I programmi Haskell fanno ampio uso di applicazioni e combinatori parziali come mezzo per definire e comporre astrazioni, quindi questo non è un esempio di giocattolo. Una buona interfaccia di funzione sarà quella in cui l'ordine dei parametri fornisce un uso amichevole e curried.
Un altro punto: una funzione senza parametri dovrebbe essere chiamata con f()
. In haskell, dal momento che si manipolano solo valori valutati pigri immutabili, basta scrivere f
e considerarlo come un valore che dovrà eseguire alcuni calcoli quando necessario. Poiché la sua valutazione non avrà alcun effetto collaterale, non ha senso avere una notazione diversa per la funzione senza parametri e il suo valore restituito.
Esistono anche altre convenzioni per l'applicazione di funzioni:
- Lisp: (f x) - prefisso con parentesi esterna
- Forth: x f - postfix