Your function doesn’t check for overflow, where most/all(?) operations on Rationals are checked:
julia> rats = [(typemax(Int64)-1)//typemax(Int64), (typemax(Int64)-2)//typemax(Int64), (typemax(Int64)-1)//typemax(Int64)]
3-element Vector{Rational{Int64}}:
9223372036854775806//9223372036854775807
9223372036854775805//9223372036854775807
9223372036854775806//9223372036854775807
julia> sum(rats)
ERROR: OverflowError: 9223372036854775806 + 9223372036854775805 overflowed for type Int64
Stacktrace:
[1] throw_overflowerr_binaryop(op::Symbol, x::Int64, y::Int64)
@ Base.Checked ./checked.jl:155
[2] checked_add
@ ./checked.jl:167 [inlined]
[3] +
@ ./rational.jl:290 [inlined]
[4] add_sum
@ ./reduce.jl:27 [inlined]
[5] _mapreduce(f::typeof(identity), op::typeof(Base.add_sum), #unused#::IndexLinear,
...
[14] sum(a::Vector{Rational{Int64}})
@ Base ./reducedim.jl:994
[15] top-level scope
@ REPL[8]:1
julia> function rationalsum(numbers::Vector{T} where T<:Rational)
den = lcm([x.den for x in numbers])
nums = (x.num * div(den, x.den) for x in numbers)
return sum(nums)//den
end
rationalsum (generic function with 1 method)
julia> rationalsum(rats)
9223372036854775801//9223372036854775807