который кажется более математическим способом
функциональные языки основаны на лямбда-исчислении . В этом поле круглые скобки не используются для применения функции.
Я также думаю, что последний стиль намного более понятен и читабелен, чем без паренов.
Читаемость в глазах смотрящего. Вы не привыкли это читать. Это немного похоже на математические операторы. Если вы понимаете ассоциативность, вам нужно всего несколько парен, чтобы прояснить структуру вашего выражения. Часто они вам не нужны.
Карри также является хорошей причиной для использования этого соглашения. В haskell вы можете определить следующее:
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
С паренсом вы можете использовать два соглашения: f(5, 6)
(не карри) или f(5)(6)
(карри). Синтаксис haskell помогает привыкнуть к концепции карри. Вы все еще можете использовать версию без карри, но более болезненно использовать ее с комбинаторами
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
Обратите внимание, как вторая версия заставляет вас регистрировать x как переменную, и что подвыражение является функцией, которая принимает целое число и добавляет к нему 5? Карри версия намного легче, но многие считают ее более читабельной.
Программы на Haskell широко используют частичное применение и комбинаторы как средство определения и составления абстракций, так что это не игрушечный пример. Хороший функциональный интерфейс будет таким, где порядок параметров обеспечивает удобное каррирование.
Еще один момент: функцию без параметров следует вызывать с помощью f()
. В haskell, поскольку вы манипулируете только неизменяемыми значениями с отложенным вычислением, вы просто пишете f
и рассматриваете его как значение, которое потребуется для выполнения некоторых вычислений при необходимости. Поскольку его оценка не будет иметь никакого побочного эффекта, нет смысла иметь другое обозначение для функции без параметров и ее возвращаемого значения.
Есть и другие соглашения для применения функции:
- Lisp: (fx) - префикс с внешними скобками
- Далее: xf - postfix