Ответ 1
Существует несколько решений вашей проблемы, основанных на сопоставлении шаблонов. Я предполагаю, что у вас есть два алгоритма (так как вы их не назовете):
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 является отличной, я предлагаю вам ее использовать. Он определен в стандартных библиотеках как:
maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing = n
maybe _ f (Just x) = f x
Ваш код будет выглядеть так:
maybe defaultValue algorithm2 (algorithm1 input)
3) Так как Maybe является functor, вы можете использовать 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))