code: def add_function_def(self, name, args, is_scalar_output):
      types = " -> ".join(
          [
              "[Double]" if is_vector else "Double"
              for is_vector, _ in [*args, (not is_scalar_output, None)]
          ]
      )
      signature = f"{name} :: {types}"
      self.add_code_line(signature)
  
      func_args = " ".join([n for _, n in args])
      function_def = f"{name} {func_args} ="
      self.add_code_line(function_def)
  
      self.increase_indent()
  
file_path: m2cgen/m2cgen/interpreters/haskell/code_generator.py
imports: from contextlib import contextmanager
  from m2cgen.ast import CompOpType
  from m2cgen.interpreters.code_generator import CodeTemplate, FunctionalCodeGenerator
label_desc: Use image node_id 4 for calling the HaskellCodeGenerator obj's underlying member method code with example usage: obj.add_function_def(name, args, is_scalar_output) without return types