Скажите, что я имею
x = Just 2
Существует ли путь (предпочтительно встроенный механизм/функция) для использования x в отдельном операторе, таким образом, что, если это - Справедливое, затем эти 2 автоматически разворачиваются и используются, и если это не Ничто, исключение повышено?
Таким образом,
(f x) + 2 == 4
если x == Just 2
, и повышает исключение если x == Nothing
.
Data.Maybe.fromJust
уже упоминалось в других ответах:
fromJust :: Maybe a -> a
fromJust Nothing = error "Maybe.fromJust: Nothing"
fromJust (Just x) = x
There's также maybe
(found in both Prelude
and Data. Возможно
):
maybe :: b -> (a -> b) -> Maybe a -> b
maybe n _ Nothing = n
maybe _ f (Just x) = f x
изJust
можно записать, используя возможно
:
fromJust = maybe (error "Maybe.fromJust: Nothing") id
Как вы видите, возможно
позволяет гибко работать с обоими случаями, не требуя совпадения по шаблону:
\x -> maybe 0 (+ 2) x -- Nothing -> 0, Just 2 -> 4
Аналогично, Прелюдия
и Данные.либо
имеют либо :: (a -> c) -> (b -> c) -> либо 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
Для этого конкретного случая из проместителя
. В целом
let Just k = x in f k + 2 == 4
этот трюк работает с любым конструктором DataType и очень часто используется с (:)
для непустых списков.