Data.Maybe.fromJust
уже упоминалось в других ответах:
fromJust :: Maybe a -> a
fromJust Nothing = error "Maybe.fromJust: Nothing"
fromJust (Just x) = x
Существует также maybe
(встречается как в Prelude
, так и в Data.Maybe
):
maybe :: b -> (a -> b) -> Maybe a -> b
maybe n _ Nothing = n
maybe _ f (Just x) = f x
fromJust
может быть написано с использованием maybe
:
fromJust = maybe (error "Maybe.fromJust: Nothing") id
Как видите, maybe
позволяет вам гибко обрабатывать оба случая, не требуя сопоставления с образцом:
\x -> maybe 0 (+ 2) x -- Nothing -> 0, Just 2 -> 4
Аналогично, Prelude
и Data.Either
имеют either :: (a -> c) -> (b -> c) -> Either a b -> c
:
\x -> either (subtract 1) (* 2) x -- Left 5 -> 4, Right 3 -> 6
Если вы определяете тип данных
data MyDataType
= TypeA { foo :: Int, bar :: String }
| TypeB { foo :: Int, baz :: () }
| TypeC { bar :: String, baz :: () }
вот так вы получите частичные функции для аксессоров.
foo :: MyDataType -> Int
bar :: MyDataType -> String
baz :: MyDataType -> ()
Они называются частичными функциями, а не общими функциями, потому что они возвращают результаты только для подмножества своих входных данных.
foo (TypeA { foo = 15, bar = "hello!" }) -- 15
bar (TypeB { foo = 12345679, baz = () }) -- error