struct X; x end
struct Y; y end
f(::X,::Y) = 1
f.( [X(1),X(1)], Y(1) )
This gives an error no method matching length(::Y)
Is there a way to tell it that the “.” vectorisation of f() is over the vector of X, not over Y ?
struct X; x end
struct Y; y end
f(::X,::Y) = 1
f.( [X(1),X(1)], Y(1) )
This gives an error no method matching length(::Y)
Is there a way to tell it that the “.” vectorisation of f() is over the vector of X, not over Y ?
You can package Y(1)
into a one element container. For Ref
or tuple
are common choices:
f.( [X(1),X(1)], Ref(Y(1)) )
f.( [X(1),X(1)], (Y(1),) )
For your own structs, you can also define Base.Broadcast.broadcastable
to tell Julia to treat it as a scalar for broadcasting:
julia> Base.Broadcast.broadcastable(y::Y) = Ref(y)
julia> f(::X,::Y) = 1
f (generic function with 1 method)
julia> f.( [X(1),X(1)], Y(1) )
2-element Vector{Int64}:
1
1