我有一个返回类型为的函数Maybe ([(Int,Int)],(Int,Int))
我想从另一个函数调用它并对数据执行操作。
但是,返回值包含在Just
. 第二种方法需要([(Int,Int)],(Int,Int))
,因此不会接受Just ([(Int,Int)],(Int,Int))
。
Just
在应用第二种方法之前,有没有办法可以修剪?
我不完全理解Just
within的使用Maybe
——但是,有人告诉我第一个 Method 的返回类型必须是Maybe
.
您的问题有多种解决方案,均基于模式匹配。我假设你有两种算法(因为你没有命名它们,我会的):
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
所有其他介绍的解决方案都使用模式匹配,我只是介绍为您执行模式匹配的标准函数。
2)前奏(和Data.Maybe)有一些内置函数来处理Maybe
s。Maybe功能很棒,我建议你使用它。 它在标准库中定义为:
maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing = n
maybe _ f (Just x) = f x
您的代码如下所示:
maybe defaultValue algorithm2 (algorithm1 input)
3)由于 Maybe 是一个仿函数,您可以使用fmap。如果您没有默认值,这更有意义。定义:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
所以你的代码看起来像:
fmap algorithm2 (algorithm1 input)
此输出将是一个Maybe
值(Nothing
如果 algorithm1 的结果是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))
你正在寻找fromJust
. 但前提是你确定你的Maybe
函数不会返回一个Nothing
!