在一个包含“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