Gives the types of all arguments to this function.  For functions returning a basic type,
        we grab all ``.first`` types until ``.second`` is no longer a ``ComplexType``.  That logic
        is implemented here in the base class.  If you have a higher-order function that returns a
        function itself, you need to override this method.

def argument_types(self) -> List[Type]:
        """
        Gives the types of all arguments to this function.  For functions returning a basic type,
        we grab all ``.first`` types until ``.second`` is no longer a ``ComplexType``.  That logic
        is implemented here in the base class.  If you have a higher-order function that returns a
        function itself, you need to override this method.
        """
        arguments = [self.first]
        remaining_type = self.second
        while isinstance(remaining_type, ComplexType):
            arguments.append(remaining_type.first)
            remaining_type = remaining_type.second
        return arguments