在一个包含“Just”的Maybe中返回,
我有一个algorithm返回->Maybe ([(Int,Int)],(Int,Int))
我想从另一个方法调用此方法,并对数据执行操作。
但是,返回值包含关键字Just
因为它可能是。 第二种方法需要([(Int,Int)],(Int,Int))
,因此不会除Just ([(Int,Int)],(Int,Int))
。
有没有一种方法可以在应用第二种方法之前修剪?
我不完全理解在Just
的使用 – 但是,我被告知第一个Method的返回types必须是Maybe
。
您的问题有几种解决scheme,都基于模式匹配。 我假设你有两个algorithm(因为你没有命名它们,我会):
algorithm1 :: a -> Maybe b algorithm2 :: b -> c input :: a
1) 模式匹配通常是从一个case语句(下面)或一个函数来完成的。
let val = algorithm1 input in case val of Nothing -> defaultValue Just x -> algorithm2 x
所有其他提出的解决scheme使用模式匹配,我只是提出执行模式匹配的标准function。
2)前奏(和Data.Maybe)有一些内置函数来处理Maybe
。 可能的function是一个伟大的,我build议你使用它。 它在标准库中被定义为:
maybe :: c -> (b -> c) -> Maybe b -> c maybe n _ Nothing = n maybe _ f (Just x) = fx
你的代码如下所示:
maybe defaultValue algorithm2 (algorithm1 input)
3)由于可能是一个函子,你可以使用fmap 。 如果你没有默认值,这样做更有意义。 定义:
instance Functor Maybe where fmap _ Nothing = Nothing fmap f (Just a) = Just (fa)
所以你的代码看起来像这样:
fmap algorithm2 (algorithm1 input)
这个输出将是一个Maybe
值(如果algorithm1的结果是Nothing
,则为Nothing
)。
4)最后,强烈劝阻,是从fromJust
。 只有使用它,如果你是积极的第一个algorithm将返回Just x
(而不是Nothing
)。 小心! 如果你fromJust val
调用val = Nothing
你会得到一个exception,这在Haskell中是不被理解的。 其定义:
fromJust :: Maybe b -> b fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck fromJust (Just x) = x
让你的代码看起来像:
algorithm2 (fromJust (algorithm1 input))
你正在寻找。 但只有当你确定你的Maybe
函数不会返回Nothing
!