F# Option int Example: IsNone, IsSome and Value

Learn about option types. Access the IsNone, IsSome and Value properties on an option.
Option. Some things exist. Some things do not. A computer runs programs. A space elevator takes no passengers. An option expresses existence.
A discriminated union. This is similar to a Nullable in C#. It can have a value (like an int) or be None. It is an optional int: a value that might not exist.
An example. Let us begin. Many built-in functions like List.tryFindIndex return options. This function uses a predicate (a lambda) and returns the first index where an element matches.

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."


IsNone, IsSome: These will return true if the option is None or is Some. Often we use these in if-statements.

If, elif

Value: 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
None, Some. Here we examine how to create a discriminated union (an option) from a function. In checkNumber we receive one argument, and return None or a Some value based on that argument.Match

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
An error. We cannot use an option as we would use the underlying value. An error will occur. We must access IsSome and Value on the result of tryFindIndex.
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'
Some research. An option is similar to a Nullable, but not the same. At a high level, though, we see discriminated unions as wrappers for values that can add a "nothing" or null value.

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).

A review. Options eliminate the need to have special values mean "no value." For example, using None instead of -1 to mean "nothing found" may be clearer. Options help clarify our code.
© 2007-2019 Sam Allen. Every person is special and unique. Send bug reports to
Dot Net Perls