Transparencia referencial

La transparencia referencial es un término utilizado en la programación funcional que se refiere a la propiedad por la cual "en un programa, una expresión E del lenguaje puede ser sustituida por otra de igual valor V, resultando en un programa cuya semántica no va a diferir de la del original".

En otras palabras, el resultado de evaluar una expresión compuesta depende únicamente del resultado de evaluar las subexpresiones que la componen y de nada más; no depende de la historia del programa en ejecución ni del orden de evaluación de las subexpresiones que la componen.

Esta propiedad no se da en lenguajes imperativos, donde abundan los efectos colaterales por asignaciones destructivas. Por ejemplo, en esta clase escrita en lenguaje Java:

class Clase{
    static int m = 1;
    static int dame() { m++; return m-1;}
    static int hola() { return dame();}
    static int a1()   { return m + dame();}
    static int a2()   { return dame() + m;}
}

No podemos sustituir dame() por su valor, en el método hola(), pues suprimiríamos el efecto lateral de incremento dando un estado del programa diferente al original. La sustitución de una expresión por su valor genera un estado diferente.

Como ya se ha dicho, otra complicación de los lenguajes sin transparencia referencial es que dificultan el razonamiento ecuacional: los métodos a1(),a2() no devuelven los mismos resultados con un mismo valor inicial de m. Por ejemplo: para m=0, a1() devolverá 0 la primera vez que se ejecute, mientras que a2() devolverá 1 la primera vez que se ejecute.


La transparencia referencial es muy útil a la hora de modificar un programa, ya que no tenemos que preocuparnos de que las modificaciones que hagamos en una parte del mismo afecten los cálculos que se hacen en otras. También es muy poderosa a la hora de verificar un programa (demostrar matemáticamente que cumple la especificación), ya que podemos utilizar propiedades ya demostradas de todas las subexpresiones que constituyen una expresión y que son válidas en cualquier contexto.