Работа по возврату из, Возможно, который содержит “Просто”

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

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

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

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

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

15
задан psmears 3 February 2018 в 19:33
поделиться

2 ответа

Есть несколько решений вашей проблемы, все основанные на сопоставлении с образцом. Я предполагаю, что у вас есть два алгоритма (поскольку вы не назвали их, я буду):

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))
49
ответ дан 1 December 2019 в 00:11
поделиться

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

5
ответ дан 1 December 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: