从包含“Just”的Maybe返回操作

时间:2010-07-30 21:28:13

标签: haskell monads maybe

我有一个返回类型为Maybe ([(Int,Int)],(Int,Int))

的函数

我想从另一个函数调用它并对数据执行操作。

但是,返回值包含在Just中。第二种方法需要([(Int,Int)],(Int,Int)),因此不会接受Just ([(Int,Int)],(Int,Int))

在应用第二种方法之前,有没有办法可以修剪Just

我不完全理解JustMaybe的使用情况 - 但是,我被告知第一种方法的返回类型必须是Maybe

2 个答案:

答案 0 :(得分:48)

您的问题有几种解决方案,都基于模式匹配。我假设你有两种算法(因为你没有给它们命名,我会):

algorithm1 :: a -> Maybe b
algorithm2 :: b -> c
input :: a

1)Pattern matching通常是从case语句(下面)或函数完成的。

let val = algorithm1 input
in case val of
    Nothing -> defaultValue
    Just x  -> algorithm2 x

所有其他呈现的解决方案都使用模式匹配,我只是提供了为您执行模式匹配的标准函数。

2)前奏(和Data.Maybe)有一些内置函数来处理Maybemaybe函数很棒,我建议你使用它。它在标准库中定义为:

maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing  = n
maybe _ f (Just x) = f x

您的代码如下:

maybe defaultValue algorithm2 (algorithm1 input)

3)由于Maybe是functor,您可以使用fmap。如果您没有默认值,这会更有意义。定义:

instance  Functor Maybe  where
    fmap _ Nothing       = Nothing
    fmap f (Just a)      = Just (f a)

所以你的代码看起来像是:

fmap algorithm2 (algorithm1 input)

如果算法1的结果为Maybe,则此输出将为Nothing值(Nothing。)

4)最后,强烈劝阻,是fromJust。只有在你肯定的情况下才使用它,第一个算法将返回Just x(而不是Nothing)。小心!如果您在fromJust val时调用val = Nothing,那么您会收到一个异常,但在Haskell中无法理解。其定义:

fromJust          :: Maybe b -> b
fromJust Nothing  = error "Maybe.fromJust: Nothing" -- yuck
fromJust (Just x) = x

让您的代码看起来像:

algorithm2 (fromJust (algorithm1 input))

答案 1 :(得分:5)

您正在寻找fromJust。但是,只有当您某些时,您的Maybe函数才会返回Nothing