F# Opções

O objetivo deste artigo é fornecer uma visão geral abrangente do tipo F# Option . Este artigo abordará o processo de criação e trabalho com valores de opção, incluindo como você pode lidar com segurança com valores ausentes, bem como a maneira pela qual você pode extrair valores de tipos de opção por meio de correspondência de padrão. O módulo Opção permite que você gerencie valores de Opção de forma eficaz e funcione como um usuário com valores de opção.

F# usa o tipo de opção quando não há valor a ser atribuído a uma variável ou função nos cálculos. Os cálculos podem usar tipos de opção para representar valores opcionais nos cálculos. Os valores podem ser Some(x) ou None.

Por exemplo, se alguém executa uma função de divisão em uma situação normal, pode retornar um valor, mas se o denominador for zero, pode gerar uma exceção. Quando as opções forem usadas aqui, será mais fácil determinar se a função foi bem-sucedida ou falhou.

O tipo subjacente de uma opção determina se ela contém um valor do tipo ou não contém nenhum valor.



Usos das opções do F#

Como exemplo, vejamos uma função de divisão. Isso é explicado no programa a seguir.

Escreveremos uma função chamada divisão e informaremos que existem dois parâmetros: 40 e 2.

Example: 

1
2
3
4
5
6
let division a b = a / b
let result = division 40 2
printfn "Result of division is: %d" result
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Após a execução do exemplo, a saída será a seguinte:

Result of division is: 20

Se colocarmos 0 no segundo argumento, teremos uma exceção:

Example: 

1
2
3
4
5
6
let division a b = a / b
let result = division 40 0
printfn "Result of division is: %d" result
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

O programa lançará o seguinte exemplo:

Unhandled Exception:
System.DivideByZeroException: Division by zero

Podemos usar tipos de opção nesses casos para inferir se a operação foi bem-sucedida ou não, retornando Some (valor) quando foi bem-sucedida ou não.

Como exemplo, vamos dar uma olhada em quais opções podem ser usadas para:

Example: 

1
2
3
4
5
6
7
8
9
10
let division a b =
match b with
| 0 -> None
| _ -> Some(a/b)
let result : int option = division 40 2
printfn "Result of division is: %A " result
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Ele irá produzir como:

Result of division is: Some 20

Propriedades e métodos da opção

Há várias propriedades e métodos disponíveis no tipo de opção, incluindo:

Propriedade ou método Tipo Visão geral
Nenhum opção T Um valor de opção definido como o valor None pode ser criado em uma propriedade estática .
não é nenhum bool Um valor true será retornado se a opção tiver o valor None.
É algum bool Quando o valor da opção não é None, o valor retornado por esta função é true.
Alguns opção T Membros estáticos criam opções que não são None, ao contrário de membros estáticos que criam opções que são None.
Valor T Um NullReferenceException é lançado se o valor subjacente for None , caso contrário, o valor subjacente será retornado.

Encontrando Elementos Através da Opção

Este método permite encontrar elementos de uma lista com base no tipo de opção disponível:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let findingElements index li =
if index >= 0 & index < List.length li then
Some (List.item index li)
else
None
let list = [1; 2; 3; 4; 5]
let elem = findingElements 3 list
match elem with
| Some x -> printfn "Found element: %d" x
| None -> printfn "Element not found"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

A saída do exemplo acima é a seguinte:

Found element: 4

Verificação de Número Positivo

Abaixo está um exemplo de verificação se o número é positivo ou não:

Example: 

1
2
3
4
5
6
7
8
9
10
let isPositive (x : int) =
if x > 0 then
Some(x)
else
None
let result : int option = isPositive(-11)
printfn "The value is: %A " result //this will print null if value is negative
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

A saída do programa acima é:

The value is: null

soma dos elementos

Este exemplo soma todos os elementos de opção na lista:

Example: 

1
2
3
4
5
6
7
8
9
10
let num = [Some 10; Some 5; None; Some 7; None]
let sum =
num
|> List.choose (fun x -> x)
|> List.sum
printfn "Sum of numbers are: %d" sum
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Isso imprimirá a soma de todos os elementos:

Sum of numbers are: 22

Exemplo de Explicação

Este código F# define uma lista chamada num que contém uma mistura de valores Some e None. Em seguida, o código calcula a soma dos valores não nulos na lista e imprime o resultado no console.

Uma lista chamada num contém cinco elementos. O primeiro, segundo e quarto elementos são Alguns valores contendo os números 10, 5 e 7, respectivamente.

O terceiro e o quinto elementos são valores None, representando dados ausentes ou nulos.

As funções List.choose e List.sum calculam a soma dos valores não nulos na lista num.

A função List.choose é uma função de ordem superior que recebe uma lista e uma função como entrada. A função é aplicada a cada elemento da lista e a lista resultante contém apenas os valores retornados pela função como alguns valores. Nesse caso, a função passada para List.choose é a função identity, que simplesmente retorna o valor de entrada. Como os valores Nenhum são excluídos pela função List.choose, a lista resultante contém apenas alguns valores da lista original.

A lista resultante de Alguns valores é então passada para a função List.sum , que calcula a soma dos elementos na lista.

Finalmente, imprime a soma de todos os números.


Verificação do número correto

Este programa verifica se o número é 44 ou não usando diferentes propriedades de opção, se for, imprimirá verdadeiro, caso contrário, imprimirá falso e se não houver valor, retornará nulo.

Example: 

1
2
3
4
5
6
7
8
9
let numberCheck = function
| Some(44) -> true
| Some(_) | None -> false
printfn "%A" (numberCheck (Some(44)))
printfn "%A" (numberCheck (Some(48)))
printfn "%A" (numberCheck None)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

A saída será como:

true
false
false

Assine nosso boletim informativo abaixo para se manter atualizado com todos os desenvolvimentos mais recentes da linguagem de programação funcional F# e aprender mais sobre a linguagem.

Nós valorizamos o seu feedback.
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0

Assine a nossa newsletter
Digite seu e-mail para receber um resumo semanal de nossos melhores posts. Saber mais!
ícone