[英]Haskell Pattern Matching on the Empty Set
我正在将一些Haskell代码从使用列表更改为集合。 我认为,我理解所需的一切,但我不确定如何在套装上进行模式匹配。 列表有这个很好的文字语法,似乎很难用Set构造函数模拟。 例如,我可能有一些像这样的代码:
foo [] = []
foo x = other_thing
如何编写此代码,以便使用集而不是列表?
好吧,你做不到。
Set
是一个抽象数据类型 [0]故意隐藏其内部表示,主要是为了维护类型系统无法静态强制执行的数据结构的不变量(具体来说,标准库Data.Set.Set
是二进制文件)搜索树)。
失去对抽象数据类型进行模式匹配的能力是一种令人不快的附带损害,但是哦。 您的选择大致是:
null
,就像在trinithis的答案中一样。 Set
转换为列表。 大多数情况下这是愚蠢的,但如果你想要迭代整个集合,它运作良好。 ViewPatterns
扩展 ,它为使用模式匹配的访问器函数提供语法糖。 Set
,把它当成一个集合 ,并将它作为一个整体用于映射,过滤等。不总是可行,但可以导致更少的代码更少显式条件/迭代。 查看模式可以让您编写如下所示的内容:
foo (setView -> EmptySet) = []
foo (setView -> NonEmpty set) = other_thing
...其中setView
是您编写的函数。 这里并没有太大的收获,但对于更复杂的伪模式可能更好
为了避免显式检查,除了众所周知的集合操作(例如并union
和intersection
,还可以考虑在Data.Set
使用filter
, partition
, map
和fold
函数。
[0]:请参阅本文 (警告:PDF),了解该术语的定义,因为我正在使用它。
import qualified Data.Set as Set
foo set
| Set.null set = bar
| otherwise = baz
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.