In working through a solution to the 8 Queens problem, a person used the following line of code:

```
sameDiag try qs = any (\(colDist,q) -> abs (try - q) == colDist) $ zip [1..] qs

```

`try` is an an item; `qs` is a list of the same items.

1. Can someone explain how `colDist` and `q` in the lambda function get bound to anything?
2. How did `try` and `q` used in the body of lambda function find their way into the same scope?
3. To the degree this is a Haskell idiom, what problem does this design approach help solve?