如何在特定情况下使用高阶结构
How to use higher-order constructs in a particular case
我想编写一个函数,它接受两个 Maybe Int
参数,如果它们都是 Just number
,则 return 是它们中的最小值,如果其中一个是 'the other'他们是 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
或 [=19 的实例这一事实=].然而,我最好的高阶尝试并没有做同样的事情:
maybeMin ell arr = ell >>= (\l -> arr >>= (\r -> if l < r then ell else arr))
因为它会 return Nothing
如果 任一 操作数是 Nothing
.
有没有一种优雅的方式来做我想做的事?
您查看了 Functor
、Applicative
和 Monad
,但您可能想查看 Alternative
。作为其使用的示例,Just 3 <|> Nothing
将产生 Just 3
而不是 Nothing
.
对于您的特定用途,如果您想要单线,您可以尝试:
maybeMin l r = min l r <|> l <|> r
为了分解它,我们首先计算 min l r
,它使用 Maybe
的 Ord
实例给出 l
和 [=22= 的最小值] 如果两者都是 Just
值。如果这可行,那么计算就到此为止,但如果其中一个不是 Just
,那么我们将检查 l
是否是一个 Just
值。如果是,那就是结果,如果不是,我们最终返回 r
作为结果。
我想编写一个函数,它接受两个 Maybe Int
参数,如果它们都是 Just number
,则 return 是它们中的最小值,如果其中一个是 'the other'他们是 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
或 [=19 的实例这一事实=].然而,我最好的高阶尝试并没有做同样的事情:
maybeMin ell arr = ell >>= (\l -> arr >>= (\r -> if l < r then ell else arr))
因为它会 return Nothing
如果 任一 操作数是 Nothing
.
有没有一种优雅的方式来做我想做的事?
您查看了 Functor
、Applicative
和 Monad
,但您可能想查看 Alternative
。作为其使用的示例,Just 3 <|> Nothing
将产生 Just 3
而不是 Nothing
.
对于您的特定用途,如果您想要单线,您可以尝试:
maybeMin l r = min l r <|> l <|> r
为了分解它,我们首先计算 min l r
,它使用 Maybe
的 Ord
实例给出 l
和 [=22= 的最小值] 如果两者都是 Just
值。如果这可行,那么计算就到此为止,但如果其中一个不是 Just
,那么我们将检查 l
是否是一个 Just
值。如果是,那就是结果,如果不是,我们最终返回 r
作为结果。