1. An expression which depends on its own value or a technique to detect such expressions. In graph reduction, when the reduction of an expression is begun, the root of the expression can be overwritten with a black hole. If the expression depends on its own value, e.g.
x = x + 1then it will try to evaluate the black hole which will usually print an error message and abort the program. A secondary effect is that, once the root of the expression has been black-holed, parts of the expression which are no longer required may be freed for garbage collection.
Without black holes the usual result of attempting to evaluate an expression which depends on itself would be a stack overflow. If the expression is evaluated successfully then the black hole will be updated with the value.
Expressions such as
ones = 1 : onesare not black holes because the list constructor, : is lazy so the reference to ones is not evaluated when evaluating ones to WHNF.