Возможно сделать семантику трубопровода, которую вы просили, для работы. Предположим, у нас есть функция двух аргументов
rel_diff(x, y) = (x - y)/(x + y)
Мы можем определить
rel_diff(y) = x -> rel_diff(x, y)
, чтобы
julia> 1 |> rel_diff(2)
-0.3333333333333333
Я не думаю, что это очень эстетично , но вы могли бы.
Другой альтернативой может быть этот трюк:
struct Infixed{X, F <: Function}
x::X
f::F
end
(|)(args...) = Base.:(|)(args...)
(|)(x, f::Function) = Infixed(x, f)
(|)(xf::Infixed, y) = xf.f(xf.x, y)
, и теперь мы можем сделать
julia> 1 |rel_diff| 2
-0.3333333333333333
Обратите внимание, что это основано на затенении базового определения |
чтобы мы не совершали пиратство типов. Это не будет работать в глобальной области видимости REPL, если вы уже использовали |
, но будет работать, если вы создадите новую локальную область, например, с let
или внутри тела функции.