繁体   English   中英

Haskell模式匹配空集

[英]Haskell Pattern Matching on the Empty Set

我正在将一些Haskell代码从使用列表更改为集合。 我认为,我理解所需的一切,但我不确定如何在套装上进行模式匹配。 列表有这个很好的文字语法,似乎很难用Set构造函数模拟。 例如,我可能有一些像这样的代码:

foo [] = []
foo x = other_thing

如何编写此代码,以便使用集而不是列表?

好吧,你做不到。

Set是一个抽象数据类型 [0]故意隐藏其内部表示,主要是为了维护类型系统无法静态强制执行的数据结构的不变量(具体来说,标准库Data.Set.Set是二进制文件)搜索树)。

失去对抽象数据类型进行模式匹配的能力是一种令人不快的附带损害,但是哦。 您的选择大致是:

  • 使用布尔谓词和守卫,例如null ,就像在trinithis的答案中一样。
  • Set转换为列表。 大多数情况下这是愚蠢的,但如果你想要迭代整个集合,它运作良好。
  • 启用GHC的ViewPatterns扩展 ,它为使用模式匹配的访问器函数提供语法糖。
  • 首先避免进行这类检查 - 如果你有一个Set ,把它当成一个集合 ,并将它作为一个整体用于映射,过滤等。不总是可行,但可以导致更少的代码更少显式条件/迭代。

查看模式可以让您编写如下所示的内容:

foo (setView -> EmptySet) = []
foo (setView -> NonEmpty set) = other_thing

...其中setView是您编写的函数。 这里并没有太大的收获,但对于更复杂的伪模式可能更好

为了避免显式检查,除了众所周知的集合操作(​​例如并unionintersection ,还可以考虑在Data.Set使用filterpartitionmapfold函数。

[0]:请参阅本文 (警告:PDF),了解该术语的定义,因为我正在使用它。

import qualified Data.Set as Set

foo set
  | Set.null set = bar
  | otherwise = baz

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM