Я пытаюсь использовать тип Maybe в Haskell. У меня есть поиск ключей, кортежей значений, которые возвращают Maybe. Как получить доступ к данным, которые были обернуты Maybe? Например, я хочу добавить целое число, содержащееся Maybe с другим целым числом.
Использование Возможно, введите Haskell
Ответ 1
В качестве альтернативы вы можете сопоставить образ:
case maybeValue of
Just value -> ...
Nothing -> ...
Ответ 2
Вы можете использовать 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
. (Вы можете продолжить цепочку дополнительных вычислений таким образом.)
Ответ 3
Как примечание: поскольку Maybe
является Monad
, вы можете строить вычисления с помощью do
-notation...
sumOfThree :: Maybe Int
sumOfThree = do
a <- someMaybeNumber
b <- someMaybeNumber
c <- someMaybeNumber
let k = 42 -- Just for fun
return (a + b + c + k)
Ответ 4
Примеры для "возможно":
> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54
Ответ 5
Многие люди против использования 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
Ответ 6
Извините, мне следовало лучше googled.
использование функции fromMaybe - именно то, что мне нужно. fromMaybe вернет значение в Maybe, если оно не является ничем, иначе оно вернет значение по умолчанию, предоставленное fromMaybe.
http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html