         concreteType = lookupInMap context, expression.token
         unless concreteType
           throw new Error "Unbound variable #{expression.token}"
+        [nextIndex, concreteType] = freshenFree nameIndex, concreteType
         expression.tea = concreteType
-        [newMap(), nameIndex, expression]
+        [newMap(), nextIndex, expression]
       # Lambda
       else if expression.type is 'function'
         {params, body, wheres} = fnDefinition expression

    for k, v of map.values
      addToMap concated, k, v
  concated


# mycroft = (context, node, environment) ->
#   if node.label is 'numerical'

    addToMap newContext, name, (subExp subs, t)
  newContext

freshenFree = (nameIndex, type) ->
  if Array.isArray type
    [nextIndex, subs] = makeFreshForEach nameIndex, findFrees type
    [nextIndex, (subExp subs, type)]
  else
    [nameIndex, type]

makeFreshForEach = (nameIndex, vars) ->
  subs = newMap()
  for type in setToArray vars
    addToMap subs, type, (freshName nameIndex++)
  [nameIndex, subs]

findFrees = (type) ->
  if Array.isArray type
    concat (for subType in type
      findFrees subType)...
  else
    if isTypeVariable type
      newSetWith type
    else
      newSet()

isTypeVariable = (name) ->
  not (Array.isArray name) and name.charCodeAt(0) >= 97

