       ctx.resetAssignTo()
       lhsCompiled)
     elemType = ctx.freshTypeVariable star
-    for elem in elems
-      unify ctx, elemType, elem.tea
     # TODO use (Seq c e) instead of (Array e)
     form.tea = new TypeApp arrayType, elemType
+
+    for elem in elems
+      unify ctx, elem.tea,
+        if isSplat elem
+          form.tea
+        else
+          elemType
+
     cond = "seq_size(#{sequence}) #{if hasSplat then '>=' else '=='} #{requiredElems}"
     combinePatterns join [(precs: [(cond_ cond)])], compiledArgs
   else


  # Typing operator like inside a known call
  precsForData = operatorCompile ctx, call

  # Gets the general type as if the extra arguments were supplied
  callTyping ctx, call

  combinePatterns join precsForData, compiledArgs

jsObjectAccess = (fieldName) ->
  if (validIdentifier fieldName) is fieldName

  args = _labeled _arguments call
  labeledArgs = labeledToMap args

  if tagFreeLabels args
    return malformed 'labels without values inside call', call

  paramNames = ctx.arity operator.token
  if not paramNames
    log "deferring in known call #{operator.token}"
    ctx.setDefer operator.token
    return 'deferred'
  positionalParams = filter ((param) -> not (lookupInMap labeledArgs, param)), paramNames
  nonLabeledArgs = map _snd, filter (([label, value]) -> not label), args

