Подтвердить что ты не робот

Работая над возвратом от Maybe, который содержит "Just",

У меня есть функция, которая имеет возвращаемый тип Maybe ([(Int,Int)],(Int,Int))

Я хотел бы вызвать это из другой функции и выполнить операцию над данными.

Однако возвращаемое значение содержится в Just. Второй метод принимает ([(Int,Int)],(Int,Int)) и поэтому не принимает Just ([(Int,Int)],(Int,Int)).

Есть ли способ, которым я могу обрезать Just перед применением второго метода?

Я не полностью понимаю использование Just in Maybe - однако мне сказали, что тип возврата для первого метода должен быть " Maybe.

4b9b3361

Ответ 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))

Ответ 2

Вы ищете fromJust. Но только если вы определенно, ваша функция Maybe не вернет Nothing!