Usando Maybe escriba en Haskell
(6)
Alternativamente, puedes emparejar patrones:
case maybeValue of
Just value -> ...
Nothing -> ...
Estoy tratando de utilizar el tipo Maybe en Haskell. Tengo una búsqueda de clave, tuplas de valor que devuelve un Tal vez. ¿Cómo accedo a los datos que fue envuelto por Maybe? Por ejemplo, quiero agregar el entero contenido por Maybe con otro entero.
Ejemplos de "tal vez":
> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54
Lo siento, debería haber buscado en Google mejor.
usar la función fromMaybe es exactamente lo que necesito. fromMaybe devolverá el valor en Maybe si no es nada, de lo contrario devolverá un valor predeterminado proporcionado a from Maybe.
http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html
Muchas personas están en contra del uso de fromJust
, sin embargo, puede ser conveniente si eres consciente de lo que sucederá cuando la búsqueda falle (¡error!)
Primero, necesitarás esto:
import Data.Maybe
Y luego su búsqueda de una lista de tuplas se verá así:
Data.Maybe.fromJust $ lookup key listOfTuples
Por ejemplo, búsqueda exitosa:
Data.Maybe.fromJust $ lookup "a" [("a",1),("b",2),("c",3)]
1
Y una falla horrible se ve así:
Data.Maybe.fromJust $ lookup "z" [("a",1),("b",2),("c",3)]
*** Exception: Maybe.fromJust: Nothing
Podría usar Data.Maybe.fromMaybe
, que toma un Maybe a
y un valor para usar si es Nothing
. Podría usar el Data.Maybe.fromJust
inseguro, que simplemente se bloqueará si el valor es Nothing
. Es probable que desee mantener las cosas en Maybe
. Si quisiera agregar un número entero en un Maybe
, podría hacer algo como
f x = (+x) <$> Just 4
que es lo mismo que
f x = fmap (+x) (Just 4)
f 3
será entonces Just 7
. (Puede continuar encadenando cómputos adicionales de esta manera).
Solo como una nota al margen: ya que Maybe
es una Monad
, puedes construir cálculos usando do
-notation ...
sumOfThree :: Maybe Int
sumOfThree = do
a <- someMaybeNumber
b <- someMaybeNumber
c <- someMaybeNumber
let k = 42 -- Just for fun
return (a + b + c + k)