code: def argument_types(self) -> List[Type]:
          
          arguments = [self.first]
          remaining_type = self.second
          while isinstance(remaining_type, ComplexType):
              arguments.append(remaining_type.first)
              remaining_type = remaining_type.second
          return arguments
docs: 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.