OpcionesOptions

El tipo de opción F# en se utiliza cuando es posible que no exista un valor real para una variable o valor con nombre.The option type in F# is used when an actual value might not exist for a named value or variable. Una opción tiene un tipo subyacente y puede contener un valor de ese tipo, o puede que no tenga un valor.An option has an underlying type and can hold a value of that type, or it might not have a value.

ComentariosRemarks

En el código siguiente se muestra una función que genera un tipo de opción.The following code illustrates a function which generates an option type.

let keepIfPositive (a : int) = if a > 0 then Some(a) else None

Como puede ver, si la entrada a es mayor que 0, Some(a) se genera.As you can see, if the input a is greater than 0, Some(a) is generated. De lo None contrario, se genera.Otherwise, None is generated.

El valor None se utiliza cuando una opción no tiene un valor real.The value None is used when an option does not have an actual value. De lo contrario, Some( ... ) la expresión proporciona a la opción un valor.Otherwise, the expression Some( ... ) gives the option a value. Los valores Some y None son útiles en la coincidencia de patrones, como en la existsfunción siguiente, true que devuelve si la opción tiene un false valor y si no lo hace.The values Some and None are useful in pattern matching, as in the following function exists, which returns true if the option has a value and false if it does not.

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

Usar opcionesUsing Options

Las opciones se usan normalmente cuando una búsqueda no devuelve un resultado de coincidencia, como se muestra en el código siguiente.Options are commonly used when a search does not return a matching result, as shown in the following code.

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 ]

En el código anterior, se busca una lista de forma recursiva.In the previous code, a list is searched recursively. La función tryFindMatch toma una función pred de predicado que devuelve un valor booleano y una lista que se va a buscar.The function tryFindMatch takes a predicate function pred that returns a Boolean value, and a list to search. Si se encuentra un elemento que satisface el predicado, la recursividad finaliza y la función devuelve el valor como una opción en la Some(head)expresión.If an element that satisfies the predicate is found, the recursion ends and the function returns the value as an option in the expression Some(head). La recursividad finaliza cuando se encuentra una coincidencia con la lista vacía.The recursion ends when the empty list is matched. En ese momento, no head se ha encontrado el valor y None se devuelve.At that point the value head has not been found, and None is returned.

Muchas F# funciones de la biblioteca que buscan en una colección un valor que puede o no existir devuelven el option tipo.Many F# library functions that search a collection for a value that may or may not exist return the option type. Por Convención, estas funciones comienzan con el try prefijo, por ejemplo Seq.tryFindIndex,.By convention, these functions begin with the try prefix, for example, Seq.tryFindIndex.

Las opciones también pueden ser útiles cuando es posible que un valor no exista, por ejemplo, si es posible que se produzca una excepción al intentar construir un valor.Options can also be useful when a value might not exist, for example if it is possible that an exception will be thrown when you try to construct a value. En el siguiente ejemplo código se muestra cómo hacerlo.The following code example illustrates this.

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

La openFile función del ejemplo anterior tiene el tipo string -> File option porque devuelve un File objeto si el archivo se abre correctamente y None si se produce una excepción.The openFile function in the previous example has type string -> File option because it returns a File object if the file opens successfully and None if an exception occurs. Dependiendo de la situación, puede que no sea una opción de diseño adecuada para detectar una excepción en lugar de permitir que se propague.Depending on the situation, it may not be an appropriate design choice to catch an exception rather than allowing it to propagate.

Además, sigue siendo posible pasar null o un valor que sea NULL a las Some mayúsculas y minúsculas de una opción.Additionally, it is still possible to pass null or a value that is null to the Some case of an option. Por lo general, esto se evita y, normalmente, está F# en programación rutinaria, pero es posible debido a la naturaleza de los tipos de referencia en .net.This is generally to be avoided, and typically is in routine F# programming, but is possible due to the nature of reference types in .NET.

Propiedades y métodos de la opciónOption Properties and Methods

El tipo de opción admite las siguientes propiedades y métodos.The option type supports the following properties and methods.

Propiedad o métodoProperty or method TypeType DESCRIPCIÓNDescription
NoneNone 'T option Propiedad estática que permite crear un valor de opción que tiene el None valor.A static property that enables you to create an option value that has the None value.
Isnone (IsNone bool Devuelve true si la opción tiene el None valor.Returns true if the option has the None value.
IsSomeIsSome bool Devuelve true si la opción tiene un valor que no Nonees.Returns true if the option has a value that is not None.
ExistenSome 'T option Miembro estático que crea una opción que tiene un valor que no Nonees.A static member that creates an option that has a value that is not None.
ValorValue 'T Devuelve el valor subyacente o produce una System.NullReferenceException excepción si el valor de es. NoneReturns the underlying value, or throws a System.NullReferenceException if the value is None.

Módulo de opciónOption Module

Hay un módulo, opción, que contiene funciones útiles que realizan operaciones en las opciones.There is a module, Option, that contains useful functions that perform operations on options. Algunas funciones repiten la funcionalidad de las propiedades pero son útiles en contextos en los que se necesita una función.Some functions repeat the functionality of the properties but are useful in contexts where a function is needed. Option. IsSome ( y Option. isnone ( son dos funciones de módulo que prueban si una opción contiene un valor.Option.isSome and Option.isNone are both module functions that test whether an option holds a value. Option. Get obtiene el valor, si lo hay.Option.get obtains the value, if there is one. Si no hay ningún valor, se produce una System.ArgumentExceptionexcepción.If there is no value, it throws System.ArgumentException.

La función Option. bind ejecuta una función en el valor, si hay un valor.The Option.bind function executes a function on the value, if there is a value. La función debe tomar exactamente un argumento y su tipo de parámetro debe ser el tipo de opción.The function must take exactly one argument, and its parameter type must be the option type. El valor devuelto de la función es otro tipo de opción.The return value of the function is another option type.

El módulo de opciones también incluye funciones que corresponden a las funciones que están disponibles para las listas, matrices, secuencias y otros tipos de colección.The option module also includes functions that correspond to the functions that are available for lists, arrays, sequences, and other collection types. Estas funciones incluyen Option.map, Option.iter, Option.forall, Option.exists, ,Option.foldBack yOption.count. Option.foldThese functions include Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold, and Option.count. Estas funciones permiten usar opciones como una colección de cero o un elemento.These functions enable options to be used like a collection of zero or one elements. Para obtener más información y ejemplos, vea la explicación de las funciones de colección en las listas.For more information and examples, see the discussion of collection functions in Lists.

Convertir a otros tiposConverting to Other Types

Las opciones se pueden convertir en listas o matrices.Options can be converted to lists or arrays. Cuando una opción se convierte en cualquiera de estas estructuras de datos, la estructura de datos resultante tiene cero o un elemento.When an option is converted into either of these data structures, the resulting data structure has zero or one element. Para convertir una opción en una matriz, use Option.toArray.To convert an option to an array, use Option.toArray. Para convertir una opción en una lista, use Option.toList.To convert an option to a list, use Option.toList.

Vea tambiénSee also