我想编写一个函数,该函数接受两个Maybe Int
参数,如果两个参数都为最小值,则返回最小值;如果两个参数为,则返回Just number
“另一个” Nothing
。我对第一次尝试不满意:
maybeMin :: Maybe Int -> Maybe Int -> Maybe Int
maybeMin Nothing arr = arr
maybeMin ell Nothing = ell
maybeMin ell@(Just l) arr@(Just r) = if l < r then ell else arr
作为一种优化,我不想在第三种情况下创建新值。即,我不想写
maybeMin ell@(Just l) arr@(Just r) = Just $ if l < r then l else r
上面的代码看起来笨重,在我看来,我应该能够利用的事实,Maybe
是一个实例Functor
,Applicative
或Monad
。但是,我尝试更高阶的尝试不会做相同的事情:
maybeMin ell arr = ell >>= (\l -> arr >>= (\r -> if l < r then ell else arr))
因为Nothing
如果任一操作数为,它将返回Nothing
。
有一种优雅的方式来做我想要的吗?
你看着Functor
,Applicative
以及Monad
,但你可能想看看Alternative
。作为其用法的一个例子,Just 3 <|> Nothing
将屈服Just 3
而不是Nothing
。
对于您的特定用途,如果您想要单线,则可以尝试:
maybeMin l r = min l r <|> l <|> r
只是为了打破下来,我们首先计算min l r
,它使用Ord
的实例Maybe
给最低的l
和r
如果两者都Just
值。如果可行,那么计算将在那里停止,但是如果其中任何一个都不是Just
,那么我们将检查是否l
是一个Just
值。如果是,那么就是结果,如果不是,我们最终将返回r
结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句