Some blocks can take different types and their return types depend on their argument types. Allow these to be defined.