MWE following discussion:
struct Bar
data
Bar(data) = (println("expensive"); new(data))
end
(B::Bar)(x) = B.data * x
Bar(2).([1,2,3]) # Bar(2) will be only evaluated once
broadcast(sqrt, Bar(2).([1,2,3])) # Bar(2) will also be evaluated once
sqrt.(Bar(2).([1,2,3])) # Bar(2) will be evaluated three times