który wydaje się być bardziej matematyczny
języki funkcjonalne inspirowane są rachunkiem lambda . W tym polu nawiasy nie są używane do zastosowania funkcji.
Myślę też, że ten drugi styl jest znacznie bardziej wyraźny i czytelny niż bez parens.
Czytelność zależy od obserwatora. Nie jesteś przyzwyczajony do czytania. To trochę jak operatory matematyczne. Jeśli rozumiesz skojarzenie, potrzebujesz tylko kilku parens, aby wyjaśnić strukturę swojego wyrażenia. Często ich nie potrzebujesz.
Curry jest również dobrym powodem do zastosowania tej konwencji. W haskell możesz zdefiniować:
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
W przypadku parens można zastosować dwie konwencje: f(5, 6)
(nie curry) lub f(5)(6)
(curry). Składnia haskell pomaga przyzwyczaić się do koncepcji curry. Nadal możesz używać wersji bez curry, ale bardziej bolesne jest używanie jej z kombinatorami
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
Zauważ, jak druga wersja zmusza cię do zarejestrowania x jako zmiennej i że podwyrażenie jest funkcją, która bierze liczbę całkowitą i dodaje do niej 5? Wersja curry jest znacznie lżejsza, ale przez wielu uważana za bardziej czytelną.
Programy Haskell w szerokim zakresie wykorzystują częściową aplikację i kombinatory do definiowania i komponowania abstrakcji, więc nie jest to zabawkowy przykład. Dobry interfejs funkcyjny to taki, w którym kolejność parametrów zapewnia przyjazne korzystanie z curry.
Kolejna kwestia: należy wywołać funkcję bez parametrów f()
. W Haskell, ponieważ manipulujesz tylko niezmiennymi leniwymi wartościami, po prostu piszesz f
i traktujesz to jako wartość, która będzie musiała wykonać pewne obliczenia, gdy zajdzie taka potrzeba. Ponieważ jego ocena nie spowoduje żadnych skutków ubocznych, nie ma sensu mieć innej notacji dla funkcji bez parametrów i jej zwracanej wartości.
Istnieją również inne konwencje dotyczące zastosowania funkcji:
- Lisp: (fx) - przedrostek z zewnętrznymi nawiasami
- Dalej: xf - postfiks