Existen varias soluciones a su problema, todas basadas en la coincidencia de patrones. Estoy suponiendo que tiene dos algoritmos (ya que no dio el nombre de ellos, lo haré):
algorithm1 :: a -> Maybe b
algorithm2 :: b -> c
input :: a
1) Pattern matching se realiza normalmente desde una declaración de caso (continuación) o una función.
let val = algorithm1 input
in case val of
Nothing -> defaultValue
Just x -> algorithm2 x
Todas las demás soluciones presentadas utilizan la coincidencia de patrones, solo presento las funciones estándar que realizan la coincidencia de patrones por usted.
2) El preludio (y Data.Maybe) tienen algunas funciones incorporadas para ocuparse de Maybe
s. La función maybe es excelente, le sugiero que la use. Se define en las bibliotecas estándar como:
maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing = n
maybe _ f (Just x) = f x
Su código se vería así:
maybe defaultValue algorithm2 (algorithm1 input)
3) Desde Tal vez es una functor podría utilizar fmap. Esto tiene más sentido si no tiene un valor predeterminado. La definición:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
lo que el código se vería así:
fmap algorithm2 (algorithm1 input)
Esta salida será un valor Maybe
(Nothing
si el resultado de algorithm1 es Nothing
).
4) Por último, y muy desaconsejado, es fromJust
. Solo úsela si está seguro de que el primer algoritmo devolverá Just x
(y no Nothing
). ¡Ten cuidado! Si llama al fromJust val
cuando val = Nothing
, obtiene una excepción, que no es apreciada en Haskell.Su definición:
fromJust :: Maybe b -> b
fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck
fromJust (Just x) = x
Dejando su código para que parezca:
algorithm2 (fromJust (algorithm1 input))
Tal vez se utiliza si su seguro del tipo del valor de retorno. Por ejemplo, su método podría devolver una cadena de error. –
@Jonathan Fischoff: Tal vez * no * se usa si no está seguro del tipo. No hay forma de que un método devuelva 'Maybe ([(Int, Int)], (Int, Int))' podría devolver una cadena de error. Tal vez se usa cuando no sabes si vas a tener un valor para devolver o no, así que puedes devolver el valor Justo o Nada. – Chuck
@Jonathan Fischoff: En parte correcto. Utiliza Maybe cuando no puede haber ningún resultado (Nothing), por ejemplo 'getPosition :: List a -> Maybe Integer'. Utiliza 'O' para devolver (sin juego de palabras) un valor de retorno válido (Derecha) o un error (Izquierda). Editar: @Chuck fue más rápido. – delnan