gpt4 book ai didi

haskell - 如何在特定情况下使用高阶结构

转载 作者:行者123 更新时间:2023-12-05 09:06:51 25 4
gpt4 key购买 nike

我想编写一个函数,它接受两个 Maybe Int 参数,如果它们都是 Just number,则返回它们中的最小值,如果其中任何一个,则返回 '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

上面的代码看起来很笨重,在我看来我应该能够利用 MaybeFunctor 的一个实例这一事实,ApplicativeMonad。然而,我最好的高阶尝试并没有做同样的事情:

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 , 然后我们检查是否 lJust值(value)。如果是,那就是结果,如果不是,我们最终返回 r作为结果。

关于haskell - 如何在特定情况下使用高阶结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65649226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com