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
为列表.大多数情况下这是愚蠢的,但如果你想要迭代整个集合,它运作良好.ViewPatterns
扩展,它为使用模式匹配的访问器函数提供语法糖.Set
,把它当成一个集合,并将它作为一个整体用于映射,过滤等.不总是可行,但可以导致更清晰的代码,更少的显式条件句/迭代.查看模式可以让您编写如下所示的内容:
foo (setView -> EmptySet) = []
foo (setView -> NonEmpty set) = other_thing
Run Code Online (Sandbox Code Playgroud)
... setView
你写的功能在哪里?这里并没有太大的收获,但对于更复杂的伪模式可能更好
为了避免明确的检查,除了众所周知的一套操作,如union
和intersection
,考虑利用的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)