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