Within an extensional semantic framework, the range of the function should in fact be the set of truth values, i.e. {1, 0}, in a standard bivalent logical framework. The domain is the set of individuals. A predicate, such as is red is analysed as a function from individuals to truth values -- namely, that function which maps an individual to 1 if that individual is red, and to 0 otherwise. The denotation of is red, as a function from individuals to truth values, can be written in the lambda calculus as follows (following Heim & Kratzer, 1998):
[[is red]] = λx. x is red
This is to be read as: 'the function from an individual x to true, iff x is red.
I'm not really sure how to answer the question of how this is different to predicate logic. Using function-talk allows us to derive the truth-conditions of sentences of natural language compositionally, by using a general rule of composition such as function application (see again Heim & Kratzer, 1998). Predicate logic is useful for giving the truth conditions of an NL sentence, but it's not much use for giving an account of how these truth conditions are computed compositionally.