Mathematica поддерживает 4 способа применения функции к своим аргументам:
- стандартная функциональная форма:
f[x]
- префикс:
f@x
или g@@{x,y}
- постфикс:
x // f
и
- infix:
x~g~y
, что эквивалентно g[x,y]
.
Какую форму вы решите использовать, зависит от вас, и часто это эстетический выбор, больше всего на свете. Внутренне f@x
интерпретируется как f[x]
. Лично я, в основном, использую постфикс, как и вы, потому что я рассматриваю каждую функцию в цепочке как преобразование, и таким образом проще объединить несколько преобразований в один. Тем не менее, мой код будет завален как стандартной формой, так и префиксной формой, в основном в зависимости от прихоти, но я склонен использовать стандартную форму чаще, так как это вызывает чувство сдержанности в отношении параметров функций.
Я немного раскрепостился с префиксной формой, включив сокращенную форму Apply
(@@
) вместе с Prefix
(@
). Из встроенных команд только стандартная форма, инфиксная форма и Apply
позволяют легко передавать более одной переменной в вашу функцию без дополнительной работы. Apply
(например, g @@ {x,y}
) работает путем замены Head
выражения ({x,y}
) на функцию, фактически оценивая функцию с несколькими переменными (g@@{x,y} == g[x,y]
).
Метод, который я использую для передачи нескольких переменных своим функциям с помощью постфиксной формы, заключается в использовании списков. Это требует немного больше работы, так как я должен написать
{x,y} // f[ #[[1]], #[[2]] ]&
для указания, какой элемент List
соответствует соответствующему параметру. Я склонен делать это, но вы можете комбинировать это с Apply
как
{x,y} // f @@ #&
, что требует меньше печатания, но может быть более трудным для интерпретации, когда вы читаете это позже.
Редактировать : Я должен отметить, что f
и g
выше являются просто заполнителями, они могут и часто заменяются чистыми функциями, например #+1& @ x
в основном эквивалентно #+1&[x]
, см. Ответ Леонида .
Чтобы прояснить, согласно ответу Леонида , эквивалентность между f@expr
и f[expr]
является истинной, если f
не обладает атрибутом , который препятствовал бы выражению expr
, от оценки до передачи в f
. Например, одним из Attributes
из Do
является HoldAll
, который позволяет ему действовать как ограничивающая конструкция, которая позволяет оценивать его параметры внутренне, не отменяя внешнего влияния. Дело в том, что expr
будет оцениваться до того, как оно будет передано f
, поэтому, если вам нужно, чтобы оно оставалось неоцененным, необходимо соблюдать особую осторожность, например, создать чистую функцию с атрибутом стиля Hold
.