   callType = markOrigin (typeFn argTea.type, returnType), originalOperator
   unify ctx, operatorTea.type, callType
   new Constrained (join operatorTea.constraints, argTea.constraints), returnType
+
+callZeroInfer = (ctx, originalOperator, operatorTea) ->
+  returnType = markOrigin (ctx.freshTypeVariable star), originalOperator
+  callType = markOrigin (typeFn returnType), originalOperator
+  unify ctx, operatorTea.type, callType
+  new Constrained operatorTea.constraints, returnType
 
 termsCompile = (ctx, list) ->
   termCompile ctx, term for term in list

flattenType = (types) ->
  if types[0].match /^\[\d+\]$/
    "[#{types[1..].join ' '}]"
  else
    "(#{types.join ' '})"


  else
    new KindFn arg, kindFnOfArgs args...

typeFn = (argType, args...) ->
  if _empty args
    new TypeApp zeroArrowType, argType
  else
    properTypeFn argType, args...

properTypeFn = (from, to, args...) ->
  if args.length is 0
    if not to
      from
    else
      new TypeApp (new TypeApp arrowType, from), to
  else
    properTypeFn from, (properTypeFn to, args...)

applyKindFn = (fn, arg, args...) ->
  if not arg
