La programación funcional es un paradigma de programación, donde los programas son una composición de funciones puras. Esto representa una diferencia fundamental con la programación orientada a objetos, donde los programas son secuencias de instrucciones, que usualmente operan sobre algún estado mutable. Dichos programas son organizados usando funciones también, pero éstas no son funciones en el sentido matemático, porque no cumplen con algunas características fundamentales.
Primeramente, una función debe ser total, esto significa que para cada entrada que se provea a la función debe haber una salida definida. Por ejemplo, la siguiente función para dividir dos enteros no es total:
def divide(a: Int, b: Int): Int = a / b
Para responder a la pregunta: ¿por qué esta función no es total? consideremos qué pasa si tratamos de dividir por cero:
divide(5, 0)
// java.lang.ArithmeticException: / by zero
La división por cero no está definida y Java maneja esto lanzando una excepción. Eso significa que la función divide no es total porque no retorna ninguna salida en el caso donde b = 0.
Algunas cosas importantes que podemos resaltar aquí:
Entonces, ¿cómo podemos solucionar este problema? Observemos esta definición alternativa de la función divide:
def divide(a: Int, b: Int): Option[Int] =
if (b != 0) Some(a/b) else None
En este caso, la función divide retorna Option[Int] en vez de Int, de tal manera que cuando b = 0, la función retorna None en vez de lanzar una excepción. Así es como hemos transformado una función parcial en una función total, y gracias a esto tenemos algunos beneficios: