I have a question about the function argument types. Here is my example.

```
julia> r = [(0, 0), (0, 0)]
2-element Array{Tuple{Int64,Int64},1}:
(0, 0)
(0, 0)
julia> f1(r::Vector{NTuple{2}}) = length(r)
f1 (generic function with 1 method)
julia> f2(r::Vector{NTuple{2, <:Real}}) = length(r)
f2 (generic function with 1 method)
julia> f3(r::Vector{NTuple{2, T}}) where {T<:Real} = length(r)
f3 (generic function with 1 method)
julia> f1(r)
ERROR: MethodError: no method matching f1(::Array{Tuple{Int64,Int64},1})
Closest candidates are:
f1(::Array{Tuple{T,T} where T,1}) at REPL[38]:1
julia> f2(r)
ERROR: MethodError: no method matching f2(::Array{Tuple{Int64,Int64},1})
Closest candidates are:
f2(::Array{Tuple{#s16,#s16} where #s16<:Real,1}) at REPL[39]:1
julia> f3(r)
2
```

My question is why `f1`

and `f2`

didnâ€™t work and how are these three functions different? Thanks!