# Function with two unitful arguments with the same dimension

Hello,

Using Unitful.jl, you can dispatch on dimensions or specific units. For example, you can write a method that takes any length quantity:

``````using Unitful: m, ft, Length

f(x::Length) = println("Got length: \$x")
``````

Or a function that takes only meters:

``````f(x::typeof(1m)) = println("Got meters: \$x")
``````

I could also write a function that takes two arguments with the same length unit

``````f(x::T, y::T) where T <: Length = println("Got same units: (\$x, \$y)")
``````

But is there a way that I can write a function that requires that both of its arguments have the same dimension, but not necessarily the same unit?

To answer my own question, I’ve found the following:

``````function g(x::AbstractQuantity{<:Number,D}, y::AbstractQuantity{<:Number,D}) where D
println("same dims: \$x + \$y = \$(x+y)")
end
``````

which works as expected:

``````julia> g(1m, 2ft)
same dims: 1 m + 2 ft = 1006//625 m
``````

I feel compelled to bound D, but I don’t think it’s actually possible, because `typeof(1m)` is `Quantity{Int64, 𝐋, Unitful.FreeUnits{(m,), 𝐋, nothing}}`, and `𝐋` is a value, not a type. And if I recall, you can’t constrain values used as type parameters.

Also, I’m not sure if there’s a good reason to use `AbstractQuantity` over just `Quantity`. Are there other useful `AbstractQuantity`s out there?

If anyone else has another solution, I’d love to see it.

Thanks,
Oliver