Option 3 is strictly better than option 2 (ignore has some special treatment in the compiler that was not available for option 2)
A more pedantic version is (fn (a,b) : type) -> ignore so when you add a new argument to fn, the partial application could be caught by the compiler. Note the special treatment I mentioned above could catch some partial application even without such type annotation, but you are using a more defensive style with type annotation.