Opções (F#)
O tipo de opção no F# é usado quando um valor real talvez não exista um valor nomeado ou variável. Uma opção tem um tipo subjacente e pode conter um valor do mesmo tipo, ou talvez ele não tenha um valor.
Comentários
O código a seguir ilustra o uso da opção do tipo.
let keepIfPositive (a : int) = if a > 0 then Some(a) else None
O valor None é usado quando uma opção não tem um valor real. Caso contrário, a expressão Some( ... ) dá a opção de um valor. Os valores Some e None são úteis para correspondência de padrões, como na seguinte função exists, que retorna true se a opção tiver um valor e false se não existir.
let exists (x : int option) =
match x with
| Some(x) -> true
| None -> false
Usando opções
Opções são usadas com freqüência quando uma pesquisa não retorna um resultado correspondente, conforme mostrado no código a seguir.
let rec tryFindMatch pred list =
match list with
| head :: tail -> if pred(head)
then Some(head)
else tryFindMatch pred tail
| [] -> None
// result1 is Some 100 and its type is int option.
let result1 = tryFindMatch (fun elem -> elem = 100) [ 200; 100; 50; 25 ]
// result2 is None and its type is int option.
let result2 = tryFindMatch (fun elem -> elem = 26) [ 200; 100; 50; 25 ]
No código anterior, uma lista é pesquisado recursivamente. A função tryFindMatch usa uma função de predicado pred , que retorna um valor booleano e uma lista para pesquisar. Se um elemento que satisfaz o predicado for encontrado, as extremidades de recursão e a função retorna o valor como uma opção na expressão Some(head). A recursão termina quando uma lista vazia é correspondida. Nesse ponto, o valor head não foi encontrado, e None é retornado.
Muitos F# funções de biblioteca que pesquisa a uma coleção para um valor que pode ou não existir retorno a option tipo. Por convenção, essas funções começam com o try prefixo, por exemplo, Seq.tryFindIndex.
Opções também podem ser úteis quando um valor pode não existir, por exemplo, se for possível que uma exceção será gerada quando você tenta construir um valor. O exemplo de código a seguir ilustra isso.
open System.IO
let openFile filename =
try
let file = File.Open (filename, FileMode.Create)
Some(file)
with
| ex -> eprintf "An exception occurred with message %s" ex.Message
None
O openFile função no exemplo anterior tem um tipo de string -> File option porque ele retorna um File se o arquivo é aberto com êxito de objeto e None se ocorrer uma exceção. Dependendo da situação, não pode ser uma opção de design apropriado para capturar uma exceção em vez de permitindo que ele se propagar.
Métodos e propriedades de opção
O tipo de opção suporta as seguintes propriedades e métodos.
Propriedade ou método |
Tipo |
Descrição |
---|---|---|
'T option |
Uma propriedade estática que permite que você crie um valor de opção que tem o None valor. |
|
bool |
Retorna true se a opção tem a None valor. |
|
bool |
Retorna true se a opção tiver um valor que não seja None. |
|
'T option |
Um membro estático que cria uma opção que tem um valor que não seja None. |
|
'T |
Retorna o valor subjacente ou lança um NullReferenceException se o valor for None. |
Módulo de opção
Há um módulo de opção, que contém funções úteis que executam operações de opções. Algumas funções Repita a funcionalidade das propriedades, mas são úteis em contextos onde uma função é necessária. Option.isSome e Option.isNone são funções de módulo que testar se uma opção contém um valor. Option.Get obtém o valor, se houver uma. Se não houver nenhum valor, ele lança ArgumentException.
O Option.bind função executa uma função no valor, se houver um valor. A função deve levar exatamente um argumento e seu tipo de parâmetro deve ser do tipo de opção. O valor de retorno da função é outro tipo de opção.
O módulo de opção também inclui funções que correspondem às funções que estão disponíveis para listas, matrizes, seqüências e outros tipos de coleção. Essas funções incluem Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold, e Option.count. Estas funções permitem opções a serem usadas como uma coleção de elementos de zero ou um. Para obter mais informações e exemplos, consulte a discussão das funções de coleção em lista.
Convertendo em outros tipos de
Opções podem ser convertidas em listas ou matrizes. Quando uma opção é convertida em qualquer uma dessas estruturas de dados, a estrutura de dados resultante tem zero ou um elemento. Para converter uma opção em uma matriz, use Option.toArray. Para converter uma opção em uma lista, use Option.toList.