Another reason for not allowing user defined functions in guards is that errors are handled differently in guards than in "normal" functions. In a guard an error does not generate an exception, it only causes the guard itself to fail.
Guards are not really expressions but tests.