Подтвердить что ты не робот

Использование Возможно, введите Haskell

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

4b9b3361

Ответ 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