Best way to express this algebra between Types

A bit of metaprogramming at least will save you repeat everything for the four operators:

for op in (:+, :-, :*, :/)
    opp = Symbol(op, "′")
    @eval $opp(a, b) = $op(a, b)
    @eval $opp(a::T, b) where T <: MultiLike = $opp.(a, b)
    @eval $opp(a, b::T) where T <: MultiLike = $opp.(a, b)
    @eval $opp(a::T, b) where T <: Integer = round(T, $op(a, b))
    @eval $opp(a, b::T) where T <: Integer = round(T, $op(a, b))
    @eval $opp(a, b::Perturbator) = $opp(a, b())
    @eval $opp(a::Perturbator, b) = $opp(a(), b)
    @eval $opp(a::T, b::Perturbator) where T <: MulitLike = $opp.(a, Ref(b))
    @eval $opp(a::Perturbator, b::T) where T <: MultiLike = $opp.(Ref(a), b)
    @eval $opp(a::T, b::Perturbator) where T <: Integer = round(T, $op(a, b()))
    @eval $opp(a::Perturbator, b::T) where T <: Integer = round(T, $op(a(), b))
end
3 Likes