C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Here: The "result" is an option int. We cannot use it as an int directly—we must extract its Value.
Some: When we print an option int to the screen, we see the type name "Some." If the inner value is 2, we see "Some 2."
PrintfnIsNone, IsSome: These will return true if the option is None or is Some. Often we use these in if-statements.
if, elifValue: For the inner value of the discriminated union, we access the Value property. This must be done only if the option is not None.
F# program that uses option, IsNone, IsSome, Value
// An example list.
let ids = [10; 20; 30]
// Find index of element with value 30.
// ... This returns an option int.
let result = List.tryFindIndex (fun y -> y = 30) ids
// Write return value.
printfn "Result = %A" result
printfn "IsNone = %A" result.IsNone
printfn "IsSome = %A" result.IsSome
// See if there is a value.
if result.IsSome then
// Get and write the value.
let num = result.Value
printfn "Value = %A" num
Output
Result = Some 2
IsNone = false
IsSome = true
Value = 2
Result: When we pass the argument 0 to checkNumber, we get None back. We test this with an if.
Next: We pass 1 to checkNumber and get Some number back. We use IsSome to test it, and then print its value.
F# program that uses None and Some
// If number is 0, return None.
// ... Otherwise return Some number.
let checkNumber n = match n with
| 0 -> None
| _ -> Some(n)
// This returns None.
let c = checkNumber 0
if c = None then
printfn "None returned"
// This returns Some number.
let n = checkNumber 1
if n.IsSome then
printfn "Some returned, value = %A" n.Value
Output
None returned
Some returned, value = 1
F# program that causes error
// This returns an option int, not an int.
let index = List.tryFindIndex (fun y -> y = 10) [2; 10; 12]
// We must access the Value, not just use the option.
let result = index + 1
Output
error FS0001: The type 'int' does not match the type 'int option'
Quote: In F#, the type option is similar to some uses of System.Nullable. For various technical reasons the two types cannot be equated (F# Language Specification).