F # - Opciones
los optionEl tipo en F # se usa en cálculos cuando puede o no existir un valor para una variable o función. Los tipos de opciones se utilizan para representar valores opcionales en los cálculos. Pueden tener dos valores posibles:Some(x) o None.
Por ejemplo, una función que realiza una división devolverá un valor en una situación normal, pero arrojará excepciones en el caso de un denominador cero. El uso de opciones aquí ayudará a indicar si la función se ha realizado correctamente o no.
Una opción tiene un tipo subyacente y puede contener un valor de ese tipo, o puede que no tenga un valor.
Usar opciones
Tomemos el ejemplo de la función de división. El siguiente programa explica esto:
Escribamos una función div y le enviemos dos argumentos 20 y 5 -
let div x y = x / y
let res = div 20 5
printfn "Result: %d" res
Cuando compila y ejecuta el programa, produce el siguiente resultado:
Result: 4
Si el segundo argumento es cero, entonces el programa lanza una excepción:
let div x y = x / y
let res = div 20 0
printfn "Result: %d" res
Cuando compila y ejecuta el programa, produce el siguiente resultado:
Unhandled Exception:
System.DivideByZeroException: Division by zero
En tales casos, podemos usar tipos de opciones para devolver Algunos (valor) cuando la operación es exitosa o Ninguno si la operación falla.
El siguiente ejemplo demuestra el uso de opciones:
Ejemplo
let div x y =
match y with
| 0 -> None
| _ -> Some(x/y)
let res : int option = div 20 4
printfn "Result: %A " res
Cuando compila y ejecuta el programa, produce el siguiente resultado:
Result: Some 5
Propiedades y métodos de las opciones
El tipo de opción admite las siguientes propiedades y métodos:
Propiedad o método | Tipo | Descripción |
---|---|---|
Ninguna | 'T opción | Una propiedad estática que le permite crear un valor de opción que tiene la None value. |
No es ninguno | bool | Devoluciones true si la opción tiene la None valor. |
Es algo | bool | Devoluciones true si la opción tiene un valor que no es None. |
Algunos | 'T opción | Un miembro estático que crea una opción que tiene un valor que no es None. |
Valor | 'T | Devuelve el valor subyacente o arroja una NullReferenceException si el valor es None. |
Ejemplo 1
let checkPositive (a : int) =
if a > 0 then
Some(a)
else
None
let res : int option = checkPositive(-31)
printfn "Result: %A " res
Cuando compila y ejecuta el programa, produce el siguiente resultado:
Result: <null>
Ejemplo 2
let div x y =
match y with
| 0 -> None
| _ -> Some(x/y)
let res : int option = div 20 4
printfn "Result: %A " res
printfn "Result: %A " res.Value
Cuando compila y ejecuta el programa, produce el siguiente resultado:
Result: Some 5
Result: 5
Ejemplo 3
let isHundred = function
| Some(100) -> true
| Some(_) | None -> false
printfn "%A" (isHundred (Some(45)))
printfn "%A" (isHundred (Some(100)))
printfn "%A" (isHundred None)
Cuando compila y ejecuta el programa, produce el siguiente resultado:
false
true
false