Error: findfirst(((x,y))->x==1, [(1,2), (3,4)])

Why does this fail? :thinking:

julia> findfirst(((x,y))->x==1, [(1,2), (3,4)])

ERROR: MethodError: no method matching (::var"#7#8")(::Tuple{Int64, 
Int64})

while these two are fine:

julia> findfirst([(1,2), (3,4)]) do (x, y)
           x==1
       end
1
function cond((x, y))
       x==1
end

julia> findfirst(cond, [(1,2), (3,4)])
1

I think this is since the double parenthesis does not really do much here, so you actually get a function expecting two variables.

What you can do is add an extra comma to show it is supposed to be a tuple of a single argument (that is itself a tuple)

findfirst(((x,y),) -> x == 1, [(1, 2), (3, 4)])
2 Likes

Note that this is the same problem as:

julia> f = ((x,y)) -> x == 1
#20 (generic function with 1 method)

julia> f((1,1))
ERROR: MethodError: no method matching (::var"#20#21")(::Tuple{Int64, Int64})
Closest candidates are:
  (::var"#20#21")(::Any, ::Any) at REPL[17]:1
Stacktrace:
 [1] top-level scope
   @ REPL[18]:1

julia> f(1,1)
true

seems to be a parsing edge case.

You can solve that by adding a comma:

julia> findfirst( ((x,y),) -> x == 1 , [(1,2), (3,4)])
1

2 Likes

Thank you for the tip! Yes it seems like an edge case.