Существует несколько решений вашей проблемы, основанных на сопоставлении с образцом. Я предполагаю, что у вас есть два алгоритма (так как вы не назвали их, я буду):
algorithm1 :: a -> Maybe b
algorithm2 :: b -> c
input :: a
1) Сопоставление с образцом обычно выполняется из оператора case (ниже) или из функции.
let val = algorithm1 input
in case val of
Nothing -> defaultValue
Just x -> algorithm2 x
Все другие представленные решения используют сопоставление с образцом, я просто представляю стандартные функции, которые выполняют сопоставление с образцом для вас.
2) В прелюдии (и Data.Maybe) есть несколько встроенных функций для работы с Maybe
s. Функция возможно великолепна, я предлагаю вам использовать ее. Он определяется в стандартных библиотеках как:
maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing = n
maybe _ f (Just x) = f x
Ваш код будет выглядеть так:
maybe defaultValue algorithm2 (algorithm1 input)
3) Поскольку Maybe - это функтор , вы можете использовать fmap . Это имеет больше смысла, если у вас нет значения по умолчанию. Определение:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
Ваш код будет выглядеть так:
fmap algorithm2 (algorithm1 input)
Этот вывод будет значением Maybe
(Nothing
, если результат алгоритма1 равен Nothing
).
4) Наконец, очень обескураженный, это fromJust
. Используйте его, только если вы уверены, что первый алгоритм вернет Just x
(а не Nothing
). Быть осторожен! Если вы позвоните fromJust val
, когда val = Nothing
, вы получите исключение, которое не приветствуется в Haskell. Его определение:
fromJust :: Maybe b -> b
fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck
fromJust (Just x) = x
Оставив свой код в следующем виде:
algorithm2 (fromJust (algorithm1 input))