F # - Opções
o optiontype in F # é usado em cálculos quando pode ou não existir um valor para uma variável ou função. Os tipos de opção são usados para representar valores opcionais em cálculos. Eles podem ter dois valores possíveis -Some(x) ou None.
Por exemplo, uma função que realiza uma divisão retornará um valor em situação normal, mas lançará exceções no caso de um denominador zero. Usar opções aqui ajudará a indicar se a função foi bem-sucedida ou falhou.
Uma opção tem um tipo subjacente e pode conter um valor desse tipo ou pode não ter um valor.
Usando opções
Tomemos o exemplo da função de divisão. O programa a seguir explica isso -
Vamos escrever uma função div e enviar dois argumentos para ela 20 e 5 -
let div x y = x / y
let res = div 20 5
printfn "Result: %d" res
Quando você compila e executa o programa, ele produz a seguinte saída -
Result: 4
Se o segundo argumento for zero, o programa lançará uma exceção -
let div x y = x / y
let res = div 20 0
printfn "Result: %d" res
Quando você compila e executa o programa, ele produz a seguinte saída -
Unhandled Exception:
System.DivideByZeroException: Division by zero
Nesses casos, podemos usar tipos de opção para retornar Some (valor) quando a operação for bem-sucedida ou Nenhum se a operação falhar.
O exemplo a seguir demonstra o uso de opções -
Exemplo
let div x y =
match y with
| 0 -> None
| _ -> Some(x/y)
let res : int option = div 20 4
printfn "Result: %A " res
Quando você compila e executa o programa, ele produz a seguinte saída -
Result: Some 5
Propriedades e métodos da opção
O tipo de opção suporta as seguintes propriedades e métodos -
Propriedade ou método | Tipo | Descrição |
---|---|---|
Nenhum | 'T opção | Uma propriedade estática que permite criar um valor de opção que tem o None value. |
IsNone | bool | Devoluções true se a opção tiver o None valor. |
É algum | bool | Devoluções true se a opção tiver um valor que não seja None. |
Alguns | 'T opção | Um membro estático que cria uma opção que tem um valor que não é None. |
Valor | 'T | Retorna o valor subjacente ou lança uma NullReferenceException se o valor for None. |
Exemplo 1
let checkPositive (a : int) =
if a > 0 then
Some(a)
else
None
let res : int option = checkPositive(-31)
printfn "Result: %A " res
Quando você compila e executa o programa, ele produz a seguinte saída -
Result: <null>
Exemplo 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
Quando você compila e executa o programa, ele produz a seguinte saída -
Result: Some 5
Result: 5
Exemplo 3
let isHundred = function
| Some(100) -> true
| Some(_) | None -> false
printfn "%A" (isHundred (Some(45)))
printfn "%A" (isHundred (Some(100)))
printfn "%A" (isHundred None)
Quando você compila e executa o programa, ele produz a seguinte saída -
false
true
false