Mónada Option
⏱ Dedicación recomendada: 0 minutos
Esto considera el contenido visible y relevante, e ignora texto colapsado o marcado como opcional.
r8vnhill/functional-programming-kt
Puedes ejecutar el siguiente comando para crear el módulo
./gradlew setupOptionModule
Mientras se crean los archivos necesarios, puedes leer el código para saber qué está pasando.
Preocúpate de que el plugin option
esté aplicado en el archivo build.gradle.kts
de tu proyecto.
./gradlew setupOptionModule
Preocúpate de que el nuevo módulo esté incluido en el archivo settings.gradle.kts
.
La mónada Option
es una de las estructuras fundamentales en la programación funcional. Su objetivo es representar la presencia o ausencia de un valor de manera explícita, eliminando la necesidad de utilizar valores nulos. Este enfoque previene errores comunes como el temido NullPointerException
y mejora la seguridad del código al obligar a quien desarrolla a manejar explícitamente los casos en los que un valor podría estar ausente.
Option
encapsula el concepto de tener o no un valor a través de dos componentes principales:
Some
: Indica que el valor está presente.None
: Indica que el valor está ausente.
Esta estructura facilita operaciones seguras y permite componer funciones que pueden devolver resultados opcionales sin necesidad de realizar verificaciones explícitas de null
.
Podemos pensar en Option
como una lista que puede contener 0 o 1 elementos. Si la lista está vacía, el valor está ausente (None
); si contiene un elemento, el valor está presente (Some
). Esto nos puede ayudar a pensar qué operaciones debieran ser posibles de realizar sobre Option
.
Leyes de la Mónada Option
Si quieres crear los archivos desde la terminal...
- Windows
- Windows (corto)
- Linux/Mac
$Group = 'com\github\username'
$OptionTestDir = "monads\src\test\kotlin\$Group\option"
New-Item -Path $OptionTestDir -ItemType Directory -Force
"package $Group.option" -replace '\\', '.' |
Out-File -FilePath "$OptionTestDir\OptionTest.kt"
$Group = 'com\github\username'
$OptionTestDir = "monads\src\test\kotlin\$Group\option"
md $OptionTestDir
"package $Group.option" -replace '\\', '.' > `
"$OptionTestDir\OptionTest.kt"
GROUP="com/github/username"
OPTION_TEST_DIR="monads/src/test/kotlin/$GROUP/option"
mkdir -p "$OPTION_TEST_DIR"
echo "package ${GROUP//\//.}.option" > "$OPTION_TEST_DIR/OptionTest.kt"
Implementación
A continuación, se presenta una implementación simple de Option
en Kotlin que sigue el patrón monádico:
sealed class Option<out A> {
inline fun <B> flatMap(f: (A) -> Option<B>): Option<B> = when (this) {
is None -> this
is Some -> f(value)
}
companion object {
fun <T> pure(value: T): Option<T> = Some(value)
}
}
data object None : Option<Nothing>()
data class Some<out T>(val value: T) : Option<T>()
Explicación
pure
: Toma un valor y lo envuelve enSome
, creando una instancia deOption
que indica que el valor está presente.flatMap
: Permite aplicar una función a un valor encapsulado enSome
, devolviendo una nueva mónadaOption
. Si el valor esNone
, no se realiza ninguna operación y se devuelveNone
.