 collectArgs = (type) ->
   if type.op?.op?.name is '->'
     join [printType type.op.arg], collectArgs type.arg
-  # else if match = type.op?.op?.name?.match /^\[(\d)\]$/
-  #   arity = parseInt match[1]
-  #   for i in [0...arity]
-
-  else if type.op
-    ["(#{printType type.op} #{printType type.arg})"]
   else
     [printType type]
 

  isAtDefinition: ->
    (definition = @_currentDefinition()) and definition.inside is 0

  # isInsideDefinition: ->
  #   (definition = @_currentDefinition()) and definition.inside isnt 0


        [type, body, wheres...] = defs
      else
        [body, wheres...] = defs

      # Arity - before deferring instead? put to assignCompile, because this makes the naming of functions special
      if ctx.isAtSimpleDefinition()
        #log "adding arity for #{ctx.definitionName()}", paramNames
        ctx.declareArity ctx.definitionName(), paramNames
        # Explicit typing
        if type
          ctx.assignType ctx.definitionName(), typeCompile ctx, type

      paramNames = map _symbol, params
      # pattern
      paramTypes = map (-> toForAll ctx.freshTypeVariable star), params
