Оперируя возвратом из Maybe, содержащего «Just» - PullRequest
15 голосов
/ 31 июля 2010

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

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

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

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

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

Ответы [ 2 ]

48 голосов
/ 31 июля 2010

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

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))
5 голосов
/ 31 июля 2010

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

...