Haskell模式匹配空集

Der*_*urn 18 haskell pattern-matching

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

foo [] = []
foo x = other_thing
Run Code Online (Sandbox Code Playgroud)

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

C. *_*ann 33

好吧,你做不到.

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

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

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

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

foo (setView -> EmptySet) = []
foo (setView -> NonEmpty set) = other_thing
Run Code Online (Sandbox Code Playgroud)

... setView你写的功能在哪里?这里并没有太大的收获,但对于更复杂的伪模式可能更好

为了避免明确的检查,除了众所周知的一套操作,如unionintersection,考虑利用的filter,partition,map,和fold功能Data.Set.

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


Tho*_*ing 32

import qualified Data.Set as Set

foo set
  | Set.null set = bar
  | otherwise = baz
Run Code Online (Sandbox Code Playgroud)

  • @simonjpascoe:等等,我们可以提供*简单*答案吗?在这里,我一直认为最少有三段...... (8认同)