               new Constrained (join body.tea.constraints, deferredConstraints),
                 markOrigin (typeFn paramTypeVars..., body.tea?.type), call
             else
-              freshInstance ctx, explicitType
+              (cloneOrigin (freshInstance ctx, explicitType), compiledType)
           # """λ#{paramNames.length}(function (#{listOf paramNames}) {
           #   #{compiledWheres}
           #   return #{compiledBody};

    declaration.final = no
    @_declare name, declaration

  _declare: (name, declaration) ->
    declaration.id ?= @freshId()
    replaceOrAddToMap @_scope(), name, declaration

  nameIndex
  # suffix = if nameIndex >= 25 then freshName (Math.floor nameIndex / 25) - 1 else ''
  # (String.fromCharCode 97 + nameIndex % 25) + suffix

cloneOrigin = (to, from) ->
  if to.TypeApp
    cloneOrigin to.op, from.op
    cloneOrigin to.arg, from.arg
  else if to.Constrained
    cloneOrigin to.type, from.type
    for c, i in to.constraints
      cloneOrigin c, from.constraints[i]
  else
    markOrigin to, from.origin
  to

mapOrigin = (type, expression) ->
  if type.TypeApp
