Используя тип 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