Haskell 模式匹配对称情况

发布于 2024-11-06 18:28:00 字数 207 浏览 6 评论 0原文

假设我有一个像这样的 haskell 表达式:

foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a

是否有任何 haskell 语法可以折叠这些情况,以便我可以匹配任一模式并指定 bar a 作为两者的响应?或者这是我能得到的最简洁的吗?

Suppose I have a haskell expression like:

foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a

Is there any haskell syntax to collapse those cases, so I can match either pattern and specify bar a as the response for both? Or is that about as succinct as I can get it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

牵强ㄟ 2024-11-13 18:28:00

如果您的代码比示例更复杂,您可能需要执行类似的操作,使用 MaybeAlternative 实例和 PatternGuards 扩展(Haskell2010 的一部分)。

{-# LANGUAGE PatternGuards #-}
import Control.Applicative

foo (x, y) | Just a <- y <|> x = bar a

如果您不熟悉它,<|> 如果有,则选择最左边的 Just,否则返回 Nothing,导致模式防护失败。

If your code is more complex than your example, you might want to do something like this, using the Alternative instance for Maybe and the PatternGuards extension (part of Haskell2010).

{-# LANGUAGE PatternGuards #-}
import Control.Applicative

foo (x, y) | Just a <- y <|> x = bar a

In case you are not familiar with it, <|> picks the left-most Just if there is one and returns Nothing otherwise, causing the pattern guard to fail.

生生漫 2024-11-13 18:28:00

这与 Haskell 中一样简洁。在 ML 中,有一个满足您需要的语法(通过编写多个模式,这些模式绑定相同的变量,彼此相邻,并在最后一个模式后面用正文分隔),但在 Haskell 中,有不是。

That's as succinct as it gets in Haskell. In ML there is a syntax for what you want (by writing multiple patterns, which bind the same variables, next to each other separated by | with the body after the last pattern), but in Haskell there is not.

空心空情空意 2024-11-13 18:28:00

您可以使用 -XViewPatterns 添加任意函数,将两种情况折叠成单个模式。
您的模式现在是一个函数 p ,它会生成您想要匹配的内容:

foo (p -> (Just a, Nothing)) = bar a

简单得多!

不过,我们必须将 p 定义为:

p (Nothing, a@(Just _)) = (a, Nothing)
p a@(Just _,   Nothing) = a
p a                     = a

或者您希望在查看之前标准化数据。


参考资料GHC 用户指南中有关视图模式的章节

You can use -XViewPatterns, to add arbitrary functions to collapse your two cases into a single pattern.
Your pattern is now a function p that yields the thing you want to match:

foo (p -> (Just a, Nothing)) = bar a

much simpler!

We have to define p though, as:

p (Nothing, a@(Just _)) = (a, Nothing)
p a@(Just _,   Nothing) = a
p a                     = a

or however you wish to normalize the data before viewing.


References: The GHC User's Guide chapter on View Patterns

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文