Opties

Het optietype in F# wordt gebruikt wanneer een werkelijke waarde mogelijk niet bestaat voor een benoemde waarde of variabele. Een optie heeft een onderliggend type en kan een waarde van dat type bevatten, of er is mogelijk geen waarde.

Opmerkingen

De volgende code illustreert een functie die een optietype genereert.

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

Zoals u kunt zien, wordt de invoer gegenereerd als de invoer a groter is dan 0 Some(a) . Anders wordt None deze gegenereerd.

De waarde None wordt gebruikt wanneer een optie geen werkelijke waarde heeft. Anders geeft de expressie Some( ... ) de optie een waarde. De waarden Some en None zijn handig in patroonkoppeling, zoals in de volgende functie exists, die retourneert true als de optie een waarde heeft en false als dat niet het geval is.

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

Opties gebruiken

Opties worden vaak gebruikt wanneer een zoekopdracht geen overeenkomend resultaat retourneert, zoals wordt weergegeven in de volgende 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 ]

In de vorige code wordt een lijst recursief doorzocht. De functie tryFindMatch gebruikt een predicaatfunctie pred die een Booleaanse waarde retourneert en een lijst om te zoeken. Als een element dat voldoet aan het predicaat wordt gevonden, eindigt de recursie en retourneert de functie de waarde als een optie in de expressie Some(head). De recursie eindigt wanneer de lege lijst overeenkomt. Op dat moment is de waarde head niet gevonden en None wordt deze geretourneerd.

Veel F#-bibliotheekfuncties die een verzameling doorzoeken op een waarde die al dan niet bestaat, retourneren het option type. Standaard beginnen deze functies met het try voorvoegsel, bijvoorbeeld Seq.tryFindIndex.

Opties kunnen ook handig zijn wanneer een waarde mogelijk niet bestaat, bijvoorbeeld als het mogelijk is dat er een uitzondering wordt gegenereerd wanneer u een waarde probeert samen te stellen. In het volgende codevoorbeeld ziet u dit.

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

De openFile functie in het vorige voorbeeld heeft een type string -> File option omdat het een File object retourneert als het bestand is geopend en None als er een uitzondering optreedt. Afhankelijk van de situatie is het mogelijk niet een geschikte ontwerpkeuze om een uitzondering te ondervangen in plaats van deze door te geven.

Daarnaast is het nog steeds mogelijk om een waarde die null is door te geven null aan het Some geval van een optie. Dit is over het algemeen te vermijden, en is meestal in routine F#-programmering, maar is mogelijk vanwege de aard van referentietypen in .NET.

Optie-eigenschappen en -methoden

Het optietype ondersteunt de volgende eigenschappen en methoden.

Eigenschap of methode Type Description
None 'T option Een statisch lid dat een optiewaarde met de None waarde maakt.
IsNone bool Retourneert true als de optie de None waarde heeft.
IsSome bool Retourneert true als de optie een waarde heeft die niet Noneis.
Some 'T option Een statisch lid dat een optie maakt die een waarde heeft die niet Noneis.
Value 'T Retourneert de onderliggende waarde of genereert een System.NullReferenceException als de waarde is None.

Optiemodule

Er is een module, Option, die nuttige functies bevat die bewerkingen uitvoeren op opties. Sommige functies herhalen de functionaliteit van de eigenschappen, maar zijn handig in contexten waar een functie nodig is. Option.isSome en Option.isNone zijn beide modulefuncties die testen of een optie een waarde bevat. Option.get verkrijgt de waarde als er een is. Als er geen waarde is, wordt deze gegenereerd System.ArgumentException.

De functie Option.bind voert een functie uit op de waarde, als er een waarde is. De functie moet precies één argument hebben en het parametertype moet het optietype zijn. De retourwaarde van de functie is een ander optietype.

De optiemodule bevat ook functies die overeenkomen met de functies die beschikbaar zijn voor lijsten, matrices, reeksen en andere verzamelingstypen. Deze functies omvattenOption.map, , Option.iter, Option.forall, Option.exists, Option.foldBack, en Option.countOption.fold. Met deze functies kunnen opties worden gebruikt, zoals een verzameling nul of één elementen. Zie de bespreking van verzamelingsfuncties in Lijsten voor meer informatie en voorbeelden.

Converteren naar andere typen

Opties kunnen worden geconverteerd naar lijsten of matrices. Wanneer een optie wordt geconverteerd naar een van deze gegevensstructuren, heeft de resulterende gegevensstructuur nul of één element. Als u een optie wilt converteren naar een matrix, gebruikt u Option.toArray. Als u een optie naar een lijst wilt converteren, gebruikt u Option.toList.

Zie ook