power
, как определено в первом фрагменте, имеет два метода. Один с одним аргументом, один с двумя. Таким образом, пункт о |>
, работающем только с методами с одним аргументом, остается в силе.
То, что вы хотите сделать, называется «частичным применением» и очень часто встречается в функциональных языках. Вы всегда можете написать
3 |> (a -> power(a, 3))
, но это быстро становится неуклюжим. Другие языки имеют синтаксис, такой как power(%1, 3)
, для обозначения этой лямбды. Есть обсуждение , чтобы добавить что-то похожее на Джулию, но это трудно понять правильно. Pipe
- это именно то исправление, основанное на макросах.
Если у вас есть контроль над определенным методом, вы также можете реализовать методы с интерфейсом, который возвращает частично примененные версии, как вам нравится - многие предикаты в Base сделайте это уже, например, ==(1)
. Есть также опция Base.Fix2(power, 3)
, но это не совсем улучшение, если вы спросите меня (кроме, может быть, лучше, чем компилятор).
И обратите внимание, что magrittr
s трубы также "макро" основанное . Разница в том, что передача аргумента в R намного сложнее, и вы не можете видеть снаружи, используется ли аргумент как значение или как выражение (по сути, R передает thunk, содержащий выражение и указатель на родительскую среду). и автоматически оценивает и кэширует его, если вы используете его в качестве значения; см. substitute
)