Looking at Base.Fix1 and Base.Fix2, there’s a lot of overlap between the proposed operators and the internal fix functions. If Fix1 were opened up to accepting more than one argument, it’d be completely equivalent to />. And for two-argument functions, \> is equivalent to Fix2. In other words, the proposed operators /> and \> are simply the logical extension of Fix1 and Fix2.
The only thing missing would be parametric types. Perhaps introduce parametric types FixFirst and FixLast, and then make /> and \> syntax sugar for them?
For example, in namedtuples.jl line 104 I see:
NamedTuple{names, T}(map(Fix1(getfield, nt), names))
with the proposed operators this could be written as
NamedTuple{names, T}(map(nt/>getfield, names))
and presumably, you’d see something like this:
julia> nt = (a=1, b=1.0);
julia> typeof(nt/>getfield)
Base.FixFirst{typeof(getfield), NamedTuple{(:a, :b), Tuple{Int64, Float64}}}
julia> nt/>getfield(:b)
1.0
similar for \> of course:
julia> arr = [1, 2, 3];
julia> typeof(arr\>map)
Base.FixLast{typeof(map), Vector{Int64}}
julia> arr\>map(x->x^2)
3-element Vector{Int64}:
 1
 4
 9
As mentioned, having a parametric type that embodies partial application
One can also conceive a Base.Fix{n} where {n isa Int} type… or for the truly deranged, Base.Fix{k} where {k isa Symbol} for currying into keyword arguments. I’m not sure what’s a good way to make a type that would cover underscore currying. ![]()