Compartilhar via


Opções (F#)

O tipo de opção em F# é usado quando um valor real talvez não exista um valor nomeado ou variável. Tem um tipo subjacente de uma opção e pode conter um valor desse 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 um valor. Os valores Some e None são úteis para correspondência de padrões, como no seguinte função exists, que retorna true se a opção tiver um valor e false se ele não não.

let exists (x : int option) = 
    match x with
    | Some(x) -> true
    | None -> false

Usando opções

Opções são usadas 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 de pesquisa. 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 corresponde a uma lista vazia. 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 de 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 não exista, por exemplo, se for possível que uma exceção será lançada 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 a função no exemplo anterior tem um tipo de string -> File option porque ele retorna um File objeto se o arquivo é aberto com êxito 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

Nenhum

'T option

Uma propriedade estática que permite que você crie um valor de opção que tem o None valor.

IsNone

bool

Retorna true se a opção tem a None valor.

IsSome

bool

Retorna true se a opção tem um valor que não está None.

Alguns

'T option

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 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 ambas as funções do módulo testar se uma opção contém um valor. Option.Get obtém o valor, se houver. 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 a uma matriz, use Option.toArray. Para converter uma opção para uma lista, use Option.toList.

Consulte também

Outros recursos

Referência de linguagem do F#

Tipos de F#