This is a great question. Let me illustrate what is going on, on a simpler example.
Now I can perfectly well do something like this:
... and f IS identical to add42, that is, it is a function that expects an integer, and returns back an integer.
What I am doing with train is, in essence, the same as the code below:
let createAdder (value:int) =
let addValue x = x + value
let add1 = createAdder 1
Here I create a function addValue inside createAdder, which will add a value to any input x, and return that function, which is ready to go: you can then call with any integer x, just like in the previous example with add42.
The train example does the exact same thing: it creates a classify function which expects one argument (pixels:int), and once that function is specified, simply returns it.
I hope the simpler example helps see what is going on - I am aware that this isn't a full explanation, and more of a repetition with less noise around it. The following blog post from F# for Fun & Profit might also be useful, it digs deeper into the why and how of how functions 'work' in F#: http://fsharpforfunandprofit.com/posts/function-values-and-simple-values/
. Hope this helps, and feel free to ask for more.
Cheers, and... happy reading :)