| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Maybe
Description
This library fills a bunch of important niches in Elm. A Maybe can help you with optional arguments, error handling, and records with optional fields.
Synopsis
- data Maybe a
- withDefault :: a -> Maybe a -> a
- map :: (a -> b) -> Maybe a -> Maybe b
- map2 :: (a -> b -> value) -> Maybe a -> Maybe b -> Maybe value
- map3 :: (a -> b -> c -> value) -> Maybe a -> Maybe b -> Maybe c -> Maybe value
- map4 :: (a -> b -> c -> d -> value) -> Maybe a -> Maybe b -> Maybe c -> Maybe d -> Maybe value
- map5 :: (a -> b -> c -> d -> e -> value) -> Maybe a -> Maybe b -> Maybe c -> Maybe d -> Maybe e -> Maybe value
- andThen :: (a -> Maybe b) -> Maybe a -> Maybe b
Definition
The Maybe type encapsulates an optional value. A value of type
either contains a value of type Maybe aa (represented as ),
or it is empty (represented as Just aNothing). Using Maybe is a good way to
deal with errors or exceptional cases without resorting to drastic
measures such as error.
The Maybe type is also a monad. It is a simple kind of error
monad, where all errors are represented by Nothing. A richer
error monad can be built using the Either type.
Instances
| FromJSON1 Maybe # | |||||
Defined in Data.Aeson.Types.FromJSON | |||||
| ToJSON1 Maybe # | |||||
Defined in Data.Aeson.Types.ToJSON Methods liftToJSON :: (a -> Bool) -> (a -> Value) -> ([a] -> Value) -> Maybe a -> Value # liftToJSONList :: (a -> Bool) -> (a -> Value) -> ([a] -> Value) -> [Maybe a] -> Value # liftToEncoding :: (a -> Bool) -> (a -> Encoding) -> ([a] -> Encoding) -> Maybe a -> Encoding # liftToEncodingList :: (a -> Bool) -> (a -> Encoding) -> ([a] -> Encoding) -> [Maybe a] -> Encoding # liftOmitField :: (a -> Bool) -> Maybe a -> Bool # | |||||
| Eq1 Maybe # | Since: base-4.9.0.0 | ||||
| Ord1 Maybe # | Since: base-4.9.0.0 | ||||
Defined in Data.Functor.Classes | |||||
| Read1 Maybe # | Since: base-4.9.0.0 | ||||
Defined in Data.Functor.Classes | |||||
| Show1 Maybe # | Since: base-4.9.0.0 | ||||
| NFData1 Maybe # | Since: deepseq-1.4.3.0 | ||||
Defined in Control.DeepSeq | |||||
| MonadThrow Maybe # | |||||
Defined in Control.Monad.Catch Methods throwM :: (HasCallStack, Exception e) => e -> Maybe a # | |||||
| Alternative Maybe # | Picks the leftmost Since: base-2.1 | ||||
| Applicative Maybe # | Since: base-2.1 | ||||
| Functor Maybe # | Since: base-2.1 | ||||
| Monad Maybe # | Since: base-2.1 | ||||
| MonadPlus Maybe # | Picks the leftmost Since: base-2.1 | ||||
| MonadFail Maybe # | Since: base-4.9.0.0 | ||||
Defined in GHC.Internal.Control.Monad.Fail | |||||
| Foldable Maybe # | Since: base-2.1 | ||||
Defined in GHC.Internal.Data.Foldable Methods fold :: Monoid m => Maybe m -> m # foldMap :: Monoid m => (a -> m) -> Maybe a -> m # foldMap' :: Monoid m => (a -> m) -> Maybe a -> m # foldr :: (a -> b -> b) -> b -> Maybe a -> b # foldr' :: (a -> b -> b) -> b -> Maybe a -> b # foldl :: (b -> a -> b) -> b -> Maybe a -> b # foldl' :: (b -> a -> b) -> b -> Maybe a -> b # foldr1 :: (a -> a -> a) -> Maybe a -> a # foldl1 :: (a -> a -> a) -> Maybe a -> a # elem :: Eq a => a -> Maybe a -> Bool # maximum :: Ord a => Maybe a -> a # minimum :: Ord a => Maybe a -> a # | |||||
| Traversable Maybe # | Since: base-2.1 | ||||
| Hashable1 Maybe # | |||||
Defined in Data.Hashable.Class | |||||
| Generic1 Maybe # | |||||
Defined in GHC.Internal.Generics Associated Types
| |||||
| MonadBaseControl Maybe Maybe # | |||||
| ReifyFlag TyConBndrVis (Maybe BndrVis) | |||||
Defined in GHC.Tc.Gen.Splice Methods reifyFlag :: TyConBndrVis -> Maybe BndrVis | |||||
| OutputableP env a => OutputableP env (Maybe a) # | |||||
Defined in GHC.Utils.Outputable | |||||
| FromJSON a => FromJSON (Maybe a) # | |||||
Defined in Data.Aeson.Types.FromJSON | |||||
| ToJSON a => ToJSON (Maybe a) # | |||||
| NFData a => NFData (Maybe a) # | |||||
Defined in Control.DeepSeq | |||||
| ToHie a => ToHie (Maybe a) | |||||
Defined in GHC.Iface.Ext.Ast | |||||
| HasLoc a => HasLoc (Maybe a) # | |||||
Defined in GHC.Parser.Annotation | |||||
| NoAnn (Maybe a) # | |||||
Defined in GHC.Parser.Annotation | |||||
| Binary a => Binary (Maybe a) # | |||||
Defined in GHC.Utils.Binary | |||||
| Outputable a => Outputable (Maybe a) # | |||||
Defined in GHC.Utils.Outputable | |||||
| Semigroup a => Monoid (Maybe a) # | Lift a semigroup into Since 4.11.0: constraint on inner Since: base-2.1 | ||||
| Semigroup a => Semigroup (Maybe a) # | Since: base-4.9.0.0 | ||||
| Generic (Maybe a) # | |||||
Defined in GHC.Internal.Generics Associated Types
| |||||
| SingKind a => SingKind (Maybe a) | Since: base-4.9.0.0 | ||||
Defined in GHC.Internal.Generics Associated Types
| |||||
| Read a => Read (Maybe a) # | Since: base-2.1 | ||||
| Show a => Show (Maybe a) # | Since: base-2.1 | ||||
| Eq (DeBruijn a) => Eq (DeBruijn (Maybe a)) # | |||||
| Eq a => Eq (Maybe a) # | Since: base-2.1 | ||||
| Ord a => Ord (Maybe a) # | Since: base-2.1 | ||||
| Hashable a => Hashable (Maybe a) # | |||||
Defined in Data.Hashable.Class | |||||
| At (Maybe a) # | |||||
| Ixed (Maybe a) # | |||||
Defined in Control.Lens.At | |||||
| AsEmpty (Maybe a) # | |||||
Defined in Control.Lens.Empty | |||||
| HasTypeVars t => HasTypeVars (Maybe t) # | |||||
Defined in Language.Haskell.TH.Lens Methods typeVarsEx :: Set Name -> Traversal' (Maybe t) Name # | |||||
| MonoFoldable (Maybe a) # | |||||
Defined in Data.MonoTraversable Methods ofoldMap :: Monoid m => (Element (Maybe a) -> m) -> Maybe a -> m # ofoldr :: (Element (Maybe a) -> b -> b) -> b -> Maybe a -> b # ofoldl' :: (a0 -> Element (Maybe a) -> a0) -> a0 -> Maybe a -> a0 # otoList :: Maybe a -> [Element (Maybe a)] # oall :: (Element (Maybe a) -> Bool) -> Maybe a -> Bool # oany :: (Element (Maybe a) -> Bool) -> Maybe a -> Bool # olength64 :: Maybe a -> Int64 # ocompareLength :: Integral i => Maybe a -> i -> Ordering # otraverse_ :: Applicative f => (Element (Maybe a) -> f b) -> Maybe a -> f () # ofor_ :: Applicative f => Maybe a -> (Element (Maybe a) -> f b) -> f () # omapM_ :: Applicative m => (Element (Maybe a) -> m ()) -> Maybe a -> m () # oforM_ :: Applicative m => Maybe a -> (Element (Maybe a) -> m ()) -> m () # ofoldlM :: Monad m => (a0 -> Element (Maybe a) -> m a0) -> a0 -> Maybe a -> m a0 # ofoldMap1Ex :: Semigroup m => (Element (Maybe a) -> m) -> Maybe a -> m # ofoldr1Ex :: (Element (Maybe a) -> Element (Maybe a) -> Element (Maybe a)) -> Maybe a -> Element (Maybe a) # ofoldl1Ex' :: (Element (Maybe a) -> Element (Maybe a) -> Element (Maybe a)) -> Maybe a -> Element (Maybe a) # headEx :: Maybe a -> Element (Maybe a) # lastEx :: Maybe a -> Element (Maybe a) # unsafeHead :: Maybe a -> Element (Maybe a) # unsafeLast :: Maybe a -> Element (Maybe a) # maximumByEx :: (Element (Maybe a) -> Element (Maybe a) -> Ordering) -> Maybe a -> Element (Maybe a) # minimumByEx :: (Element (Maybe a) -> Element (Maybe a) -> Ordering) -> Maybe a -> Element (Maybe a) # | |||||
| MonoFunctor (Maybe a) # | |||||
| MonoPointed (Maybe a) # | |||||
| MonoTraversable (Maybe a) # | |||||
| Validity a => Validity (Maybe a) # | A Maybe thing is valid if the thing inside is valid or it's nothing
It makes sense to assume that | ||||
Defined in Data.Validity Methods validate :: Maybe a -> Validation # | |||||
| Pretty a => Pretty (Maybe a) # | |||||
Defined in Text.PrettyPrint.Annotated.WL | |||||
| HasType ty orig g => HasTypeProd ty ('Nothing :: Maybe a) (orig :: Symbol) (f :: Type -> Type) (g :: Type -> Type) | |||||
Defined in GHC.Types.Error.Codes Methods getTypeProd :: (f :*: g) a0 -> ty | |||||
| HasType ty orig f => HasTypeProd ty ('Just l :: Maybe a) (orig :: Symbol) (f :: Type -> Type) (g :: Type -> Type) | |||||
Defined in GHC.Types.Error.Codes Methods getTypeProd :: (f :*: g) a0 -> ty | |||||
| SingI ('Nothing :: Maybe a) | Since: base-4.9.0.0 | ||||
Defined in GHC.Internal.Generics | |||||
| Each (Maybe a) (Maybe b) a b # |
| ||||
| SingI a2 => SingI ('Just a2 :: Maybe a1) | Since: base-4.9.0.0 | ||||
Defined in GHC.Internal.Generics | |||||
| type Rep1 Maybe # | Since: base-4.6.0.0 | ||||
Defined in GHC.Internal.Generics | |||||
| type StM Maybe a # | |||||
Defined in Control.Monad.Trans.Control | |||||
| type Anno (Maybe Role) # | |||||
Defined in GHC.Hs.Decls | |||||
| type DemoteRep (Maybe a) # | |||||
Defined in GHC.Internal.Generics | |||||
| type Rep (Maybe a) # | Since: base-4.6.0.0 | ||||
Defined in GHC.Internal.Generics | |||||
| data Sing (b :: Maybe a) # | |||||
| type Index (Maybe a) # | |||||
Defined in Control.Lens.At | |||||
| type IxValue (Maybe a) # | |||||
Defined in Control.Lens.At | |||||
| type Element (Maybe a) # | |||||
Defined in Data.MonoTraversable | |||||
Common Helpers
withDefault :: a -> Maybe a -> a Source #
Provide a default value, turning an optional value into a normal
value. This comes in handy when paired with functions like
get which gives back a Maybe.
>>> withDefault 100 (Just 42) 42 >>> withDefault 100 Nothing 100 >>> withDefault "unknown" (Dict.get "Tom" Dict.empty) "unknown"
Note: This can be overused! Many cases are better handled by a case
expression. And if you end up using withDefault a lot, it can be a good sign
that a custom type
will clean your code up quite a bit!
map :: (a -> b) -> Maybe a -> Maybe b Source #
Transform a Maybe value with a given function:
>>> map sqrt (Just 9) Just 3 >>> map sqrt Nothing Nothing >>> map sqrt (String.toFloat "9") Just 3 >>> map sqrt (String.toFloat "x") Nothing
map2 :: (a -> b -> value) -> Maybe a -> Maybe b -> Maybe value Source #
Apply a function if all the arguments are Just a value.
>>> map2 (+) (Just 3) (Just 4) Just 7 >>> map2 (+) (Just 3) Nothing Nothing >>> map2 (+) Nothing (Just 4) Nothing >>> map2 (+) (String.toInt "1") (String.toInt "123") Just 124 >>> map2 (+) (String.toInt "x") (String.toInt "123") Nothing >>> map2 (+) (String.toInt "1") (String.toInt "1.3") Nothing
map4 :: (a -> b -> c -> d -> value) -> Maybe a -> Maybe b -> Maybe c -> Maybe d -> Maybe value Source #
map5 :: (a -> b -> c -> d -> e -> value) -> Maybe a -> Maybe b -> Maybe c -> Maybe d -> Maybe e -> Maybe value Source #
Chaining Maybes
andThen :: (a -> Maybe b) -> Maybe a -> Maybe b Source #
Chain together many computations that may fail. It is helpful to see an equivalent definition:
andThen :: (a -> Maybe b) -> Maybe a -> Maybe b
andThen callback maybe =
case maybe of
Just value ->
callback value
Nothing ->
NothingThis means we only continue with the callback if things are going well. For example, say you need to parse some user input as a month:
parseMonth :: String -> Maybe Int
parseMonth userInput =
String.toInt userInput
|> andThen toValidMonth
toValidMonth :: Int -> Maybe Int
toValidMonth month =
if 1 <= month && month <= 12 then
Just month
else
NothingIn the parseMonth' function, if 'String.toInt produces Nothing (because
the userInput was not an integer) this entire chain of operations will
short-circuit and result in Nothing. If toValidMonth results in
Nothing, again the chain of computations will result in Nothing.