Используя тип Maybe в Haskell

Я пытаюсь использовать тип Maybe в Haskell. У меня есть поиск по кортежу key, value, который возвращает Maybe. Как я могу получить доступ к данным, которые были завернуты в Возможно? Например, я хочу добавить целое число, содержащееся в Maybe, с другим целым числом.

6 ответов

Решение

В качестве альтернативы вы можете сопоставить шаблон:

case maybeValue of
  Just value -> ...
  Nothing    -> ...

Вы могли бы использовать Data.Maybe.fromMaybe, который занимает Maybe a и значение для использования, если оно Nothing, Вы можете использовать небезопасные Data.Maybe.fromJust, который просто потерпит крах, если значение Nothing, Вы, вероятно, хотите сохранить вещи в Maybe, Если вы хотите добавить целое число в MaybeВы могли бы сделать что-то вроде

f x = (+x) <$> Just 4

который так же, как

f x = fmap (+x) (Just 4)

f 3 будет тогда Just 7, (Вы можете продолжить цепочку дополнительных вычислений таким образом.)

Просто как примечание: с Maybe это MonadВы можете строить вычисления, используя doпримечание...

sumOfThree :: Maybe Int
sumOfThree = do
  a <- someMaybeNumber
  b <- someMaybeNumber
  c <- someMaybeNumber
  let k = 42 -- Just for fun
  return (a + b + c + k)

Примеры для "возможно":

> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54

Извините, я должен был погуглить лучше.

использование функции fromMaybe именно то, что мне нужно. fromMaybe вернет значение в Maybe, если оно не является ничем, в противном случае оно вернет значение по умолчанию, предоставленное fromMaybe.

http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html

Многие люди против использования fromJustОднако это может быть удобно, если вы знаете, что произойдет, когда поиск не удастся (ошибка!!)

Во-первых, вам понадобится это:

import Data.Maybe

И тогда ваш поиск из списка кортежей будет выглядеть так

Data.Maybe.fromJust $ lookup key listOfTuples

Например, успешный поиск:

Data.Maybe.fromJust $ lookup "a" [("a",1),("b",2),("c",3)]
1

И ужасный провал выглядит так:

Data.Maybe.fromJust $ lookup "z" [("a",1),("b",2),("c",3)]
*** Exception: Maybe.fromJust: Nothing
Другие вопросы по тегам