 
 star = '*'
 arrowType = new TypeConstr 'Fn', kindFn 2
+zeroArrowType = new TypeConstr 'Fn0', kindFn 1
 arrayType = new TypeConstr 'Array', kindFn 1
 listType = new TypeConstr 'List', kindFn 1
 hashmapType = new TypeConstr 'Map', kindFn 2

  """
  '(g 3)', 3

  # TODO: support matching with the same name
  #       to implement this we need the iife to take as arguments all variables
  #       with the same names, since JavaScript shadows it too strongly and

callTyping = (ctx, call) ->
  return if ctx.shouldDefer()
  terms = _terms call
  op = _operator call
  call.tea =
    if terms.length is 1
      # terms = join terms, [tea: toConstrained (markOrigin (ctx.freshTypeVariable star), call)]
      callZeroInfer ctx, op, op.tea
    else
      callInfer ctx, (_operator call), terms

callInfer = (ctx, operator, terms) ->
  # Curry the call
