Exponentiation operator for iterated functions?

What about something like this?

function Base.:^(x::Any, exponent::Tuple{Function,Integer})
    op, p = exponent
    p == 1 ? x : reduce(op, fill(x, p))
end
julia> typeof(1.0) |> supertype^(∘,3)
Number

julia> 3^(+,3) # Iterated addition -> Scalar multiplication
9

julia> 3^(^, 3) # Tetration 😄
19683

Implementation and syntax is obviously up for debate: For example, closure could work too e.g. 3 ^(+) 3, but I couldn’t figure out how to do it; I don’t know how to return an anonymous function that behaves like an operator.

I feel like a more general exponentiation operator has several benefits:

  • Convenient and intuitive iteration of any closed binary operator (e.g. the main post) without having to implement a new ^ method for custom types
  • When you have more than one product-like operation defined, you can eliminate ambiguity as to which operation your exponentiation is referring to.
  • If you want to be more strict, instead of overloading ^ for custom types to mean iteration of some non-* operator, you can instead specify exactly what you mean without much loss in convenience.
  • Code golf :stuck_out_tongue:

As for how useful it would be in practice…I’m not the person to ask.


My dream is for regular exponentiation x^p to just be a special case via

(^)(x::Any, p::Integer) = x^(*, p)

:ghost:

See related this thread I made.