En Scala, una función parcial (partial function) es una función que solo está definida para un subconjunto de valores de entrada posibles. Por ejemplo, la función sqrt
está definida solo para números positivos, y si se le pasa un número negativo, lanzará una excepción. Podemos definir una función parcial que maneje solo los números positivos de esta manera:
val sqrt: PartialFunction[Double, Double] = {
case x if x >= 0 => Math.sqrt(x)
}
// Ejemplo de uso de la función parcial
sqrt(4) // devuelve 2.0
sqrt(-4) // lanza una excepción
En este ejemplo, definimos una función parcial sqrt
que toma un Double
como entrada y devuelve otro Double
. La sintaxis case x if x >= 0 => Math.sqrt(x)
define el comportamiento de la función para los valores de entrada que son mayores o iguales a cero. La función solo está definida para estos valores y lanzará una excepción si se le pasa un valor negativo.
Para definir una función parcial en Scala, usamos la clase PartialFunction[A, B]
, donde A
es el tipo de entrada y B
es el tipo de salida. Dentro de la clase PartialFunction
, definimos una serie de casos que manejan diferentes valores de entrada.
Podemos usar la función parcial isDefinedAt
para verificar si la función está definida para un valor de entrada determinado:
sqrt.isDefinedAt(4) // devuelve true
sqrt.isDefinedAt(-4) // devuelve false
También podemos combinar varias funciones parciales en una sola función usando el método orElse
. Por ejemplo:
val reciprocal: PartialFunction[Double, Double] = {
case x if x != 0 => 1 / x
}
val totalFunction = sqrt.orElse(reciprocal)
totalFunction(4) // devuelve 2.0
totalFunction(0) // lanza una excepción
totalFunction(-4) // devuelve -0.25
En este ejemplo, definimos una segunda función parcial reciprocal
que toma un Double
como entrada y devuelve otro Double
. Esta función está definida para cualquier valor de entrada que no sea cero. Luego, usamos el método orElse
para combinar sqrt
y reciprocal
en una sola función llamada totalFunction
. Si sqrt
no puede manejar el valor de entrada, totalFunction
intentará usar reciprocal
en su lugar.
En resumen, las funciones parciales son una herramienta útil para manejar casos especiales o excepciones en una función. En lugar de lanzar una excepción, podemos definir una función parcial que maneje los valores de entrada especiales de manera segura y elegante.