Maybe

It is often necessary to model values which can be undefined. This can be done using the type Maybe a, where a is the type of the value which might be undefined. For example, Maybe String can be used to represent the values which are either text strings, or undefined.

The type is defined with two constructors:

type Maybe a
  | Some a
  | None

So a value of type Maybe String will either be of the form Some "a text string" (representing the actual string values), or None (representing the undefined value).

maybe : b -> (a -> b) -> Maybe a -> b

The maybe function takes a default value, a function, and a Maybe value. The default value is returned if the Maybe value is None, otherwise the result of applying the function to the value inside the Some is returned.

Examples

val a = maybe 0 (\x -> x + 5) (Some 2)
//    = 7
val b = maybe 0 (\x -> x + 5) None
//    = 0

fromMaybe : a -> Maybe a -> a

The fromMaybe function extracts the value from a Maybe, using the default value for the None case.

Examples

val a = fromMaybe 0 (Some 5)
//    = 5
val b = fromMaybe 0 None
//    = 0

Maybe::map : (a -> b) -> Maybe a -> Maybe b

Lift any function to a function in Maybe.

Examples

val a = Maybe::map (\m -> m * 2) (Some 5)
//    = Some 10
val b = Maybe::map (\m -> m * 2) None
//    = None

Maybe::map2 : (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c

Lift any binary function to a function in Maybe.

Examples

val a = Maybe::map2 (\x -> \y -> x + y) (Some 7) (Some 5)
//    = Some 12
val b = Maybe::map2 (\x -> \y -> x + y) (Some 7) None
//    = None
val c = Maybe::map2 (\x -> \y -> x + y) None (Some 5)
//    = None
val d = Maybe::map2 (\x -> \y -> x + y) None None
//    = None

Maybe::isSome : Maybe a -> Bool

Returns True if the input is a Some, returns False otherwise.

Examples

val a = Maybe::isSome (Some 2)
//    = True
val b = Maybe::isSome (Some "a text string")
//    = True
val c = Maybe::isSome None
//    = False

Maybe::any : (a -> Bool) -> Maybe a -> Bool

Returns True if, and only if, the given Maybe has a value, and this value satisfies the given predicate.

Examples

val a = Maybe::any (\n -> n > 4) (Some 5)
//    = True
val b = Maybe::any (\n -> n > 4) (Some 2)
//    = False
val c = Maybe::any (\n -> n > 4) None
//    = False

Maybe::all : (a -> Bool) -> Maybe a -> Bool

Returns True if the given Maybe has no value, or if it has a value which satisfies the given predicate.

Examples

val a = Maybe::all (\x -> x >= 1) None
//    = True
val b = Maybe::all (\x -> x >= 1) (Some 2)
//    = True
val c = Maybe::all (\x -> x >= 1) (Some 0)
//    = False

Maybe::bind : (a -> Maybe b) -> Maybe a -> Maybe b

Applies a function that returns a Maybe to a Maybe value if that value is Some. None otherwise

Examples

val a = Maybe::bind (\x -> Some (x + 1)) None
//    = None
val b = Maybe::bind (\x -> None) (Some 1)
//    = None
val c = Maybe::bind (\x -> Some (x + 1)) (Some 1)
//    = Some 2