web-dev-qa-db-fra.com

Utilisation du type Maybe dans Haskell

J'essaie d'utiliser le type Maybe dans Haskell. J'ai une recherche de clé, de tuples de valeur qui renvoie un peut-être. Comment accéder aux données qui ont été encapsulées par Maybe? Par exemple, je veux ajouter l'entier contenu par Peut-être avec un autre entier.

35
dpsthree

Alternativement, vous pouvez faire correspondre les motifs:

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

Vous pouvez utiliser Data.Maybe.fromMaybe, qui prend un Maybe a et une valeur à utiliser si elle est Nothing. Vous pouvez utiliser le dangereux Data.Maybe.fromJust, qui plantera juste si la valeur est Nothing. Vous voudrez probablement garder les choses dans Maybe. Si vous vouliez ajouter un entier dans un Maybe, vous pourriez faire quelque chose comme

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

ce qui est le même que

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

f 3 sera alors Just 7. (Vous pouvez continuer à enchaîner des calculs supplémentaires de cette manière.)

20
arsenm

Exemples pour "peut-être":

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

Juste comme note latérale: Puisque Maybe est un Monad, vous pouvez construire des calculs en utilisant la notation do- ...

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

Désolé, j'aurais dû mieux googler.

utiliser la fonction fromMaybe est exactement ce dont j'ai besoin. fromMaybe renverra la valeur dans Maybe si ce n'est pas rien, sinon il renverra une valeur par défaut fournie à fromMaybe.

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

4
dpsthree

Beaucoup de gens sont contre l'utilisation de fromJust, mais cela peut être pratique si vous savez ce qui se passera lorsque la recherche échoue (erreur !!)

Tout d'abord, vous en aurez besoin:

import Data.Maybe

Et puis votre recherche à partir d'une liste de tuples ressemblera à ceci

Data.Maybe.fromJust $ lookup key listOfTuples

Par exemple, recherche réussie:

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

Et un échec horrible ressemble à ceci:

Data.Maybe.fromJust $ lookup "z" [("a",1),("b",2),("c",3)]
*** Exception: Maybe.fromJust: Nothing
4
vikingsteve