       malformed ctx, call, "Type annotation required"
       rest = join [type], rest
     else if not redefining
-      ctx.declare macroName,
-        arity: paramNames
-        type: type = quantifyUnbound ctx, typeConstrainedCompile ctx, type
+      type = quantifyUnbound ctx, typeConstrainedCompile ctx, type
+      if not ctx.isDeclared macroName
+        ctx.declare macroName,
+          arity: paramNames
+          type: type
       call.tea = type
 
     if not rest.length > 0


printType = (type) ->
  if type.TypeVariable
    "#{type.name}"
  else if type.QuantifiedVar
    "#{type.var}"
  else if type.TypeConstr

      # Check the declared type
      declaredType = ctx.type name
      explicitType = freshInstance ctx, declaredType
      updatedDeclaredType = quantifyUnbound ctx, (substitute ctx.substitution, explicitType)
      unify ctx, currentType.type, explicitType.type
      unifiedType = substitute ctx.substitution, explicitType
      inferredType = quantifyUnbound ctx, unifiedType
      if not typeEq inferredType, updatedDeclaredType
        ctx.extendSubstitution substituionFail "#{name}'s declared type is too general, inferred #{plainPrettyPrint inferredType}"
      # Context reduction
      isDeclaredConstraint = (c) ->
