(Just answering the first question. Others have answered the second question thoroughly.)
It's worth mentioning that you can do
{x,y} // (f @@ #) &
f[x,y]
(No parentheses needed, but I added them for clarity.)
You could even make your own function to do this (slightly) more compactly, especially if you have trouble remembering the @
's and #
's :
ClearAll[pf]
pf[ argList_, f_ ] := f @@ argList
Then you can do what you want using an infix operator:
{x,y} ~pf~ f
f[x,y]
Edit:
Lately I've taken to writing my first example above as
{x,y} // Apply[f]
or
{x,y} // Apply@f
which I fine somewhat more readable, particularly when there are other pure functions involved. Note that this uses the operator form of Apply
.