2 回答
TA贡献1824条经验 获得超6个赞
您的问题有几种解决方案,都基于模式匹配。我假设你有两个算法(因为你没有给它们命名,我会):
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)有一些内置的函数来处理Maybes。在 可能的功能是一个伟大的,我建议你使用它。它在标准库中定义为:
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如果算法1的结果是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))
- 2 回答
- 0 关注
- 439 浏览
添加回答
举报