Home
F#
Option Example (IsNone, IsSome)
Updated Dec 22, 2023
Dot Net Perls
Option. In F# an option is 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.
Avoiding errors. Options will cause some small level of performance overhead, but if we use them to prevent exceptions, they can result in an overall improvement in F#.
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.
Detail 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."
printfn
Tip IsNone and IsSome will return true if the option is None or is Some. Often we use these in if-statements.
if
Important For the inner value of the discriminated union, we access the Value property. This must be done only if the option is not None.
// 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
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.
// 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
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.
// 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
error FS0001: The type 'int' does not match the type 'int option'
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.
Dot Net Perls is a collection of pages with code examples, which are updated to stay current. Programming is an art, and it can be learned from examples.
Donate to this site to help offset the costs of running the server. Sites like this will cease to exist if there is no financial support for them.
Sam Allen is passionate about computer languages, and he maintains 100% of the material available on this website. He hopes it makes the world a nicer place.
This page was last updated on Dec 22, 2023 (edit).
Home
Changes
© 2007-2025 Sam Allen