У меня есть функция, которая имеет тип возврата Maybe ([(Int,Int)],(Int,Int))
Я хотел бы назвать это от другой функции и выполнить операцию на данных.
Однако возвращаемое значение содержится в Just
. Второй метод берет ([(Int,Int)],(Int,Int))
и поэтому не примет Just ([(Int,Int)],(Int,Int))
.
Есть ли способ, которым я могу обрезать Just
прежде, чем применить второй метод?
Я не полностью понимаю использование Just
в Maybe
- однако, мне сказали, что тип возврата для первого Метода должен быть Maybe
.
Есть несколько решений вашей проблемы, все основанные на сопоставлении с образцом. Я предполагаю, что у вас есть два алгоритма (поскольку вы не назвали их, я буду):
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) Prelude (и 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)
Этот результат будет иметь значение Может быть
( Ничего
, если результатом алгоритма1 является Ничего
).
4) Наконец, настоятельно не рекомендуется, это от Just
. Используйте его только в том случае, если вы уверены, что первый алгоритм вернет 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))
Вы ищете fromJust
. Но только если вы уверены, что ваша функция Maybe
не вернет Nothing
!