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

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

34 голосов
/ 04 сентября 2010

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

Ответы [ 6 ]

36 голосов
/ 04 сентября 2010

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

case maybeValue of
  Just value -> ...
  Nothing    -> ...
19 голосов
/ 04 сентября 2010

Вы можете использовать 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,(Вы можете продолжить цепочку дополнительных вычислений таким образом.)

8 голосов
/ 06 сентября 2010

Примеры для «может быть»:

> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54
8 голосов
/ 04 сентября 2010

Как примечание: поскольку 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 голосов
/ 24 сентября 2013

Многие люди против использования 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
3 голосов
/ 04 сентября 2010

Извините, мне следовало погуглить лучше.

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

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

...