subroutine callable procedure method lambda closure generator async pure impure recursive higher order first class anonymous curried variadic unary binary predicate total partial deterministic