Google News
logo
F# - Interview Questions
Explain Value Options in F#?
The Value Option type in F# is used when the following two circumstances hold :
 
* A scenario is appropriate for an F# Option.
* Using a struct provides a performance benefit in your scenario.

Not all performance-sensitive scenarios are "solved" by using structs. You must consider the additional cost of copying when using them instead of reference types. However, large F# programs commonly instantiate many optional types that flow through hot paths, and in such cases, structs can often yield better overall performance over the lifetime of a program.
 
Definition : Value Option is defined as a struct discriminated union that is similar to the reference option type. Its definition can be thought of this way:
[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
    | ValueNone
    | ValueSome of 'T
 
Value Option conforms to structural equality and comparison. The main difference is that the compiled name, type name, and case names all indicate that it is a value type.
 
Using Value Options : Value Options are used just like Options. ValueSome is used to indicate that a value is present, and ValueNone is used when a value is not present:
let tryParseDateTime (s: string) =
    match System.DateTime.TryParse(s) with
    | (true, dt) -> ValueSome dt
    | (false, _) -> ValueNone

let possibleDateString1 = "1990-12-25"
let possibleDateString2 = "This is not a date"

let result1 = tryParseDateTime possibleDateString1
let result2 = tryParseDateTime possibleDateString2

match (result1, result2) with
| ValueSome d1, ValueSome d2 -> printfn "Both are dates!"
| ValueSome d1, ValueNone -> printfn "Only the first is a date!"
| ValueNone, ValueSome d2 -> printfn "Only the second is a date!"
| ValueNone, ValueNone -> printfn "None of them are dates!"
As with Options, the naming convention for a function that returns ValueOption is to prefix it with try.
Value Option properties and methods : There is one property for Value Options at this time: Value. An InvalidOperationException is raised if no value is present when this property is invoked.
 
Value Option functions : The ValueOption module in FSharp.Core contains equivalent functionality to the Option module. There are a few differences in name, such as defaultValueArg:
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
Advertisement