我的自定义队列类型中包装Data.Sequence有什么问题吗?

3
我希望我的应用程序能有一个队列。从我读到的资料来看,Data.Sequence 是生产代码中最好的选择。为了保持我的代码优雅、符合惯例和总体上更像 Haskell,把 Data.Sequence 包装在自己的队列数据类型中以隐藏不需要的功能是否有问题呢?

3
您可以将一种区分方式视为“序列”是一种数据结构:它描述了内存中的布局方式(在某种抽象层次上),但不对内容施加任何含义。另一方面,“队列”是一种数据类型,它施加了含义(例如,如果“insert(a)”在“insert(b)”之前,则“remove”将在返回“b”之前返回“a”),但没有指定如何管理。您的数据类型可以基于“序列”或其他数据结构来实现。 - chepner
1个回答

10

没有任何问题 - 实际上,这正是newtype的用途!

理想情况下,你的类型应该反映你的意图 - 无论是谁阅读你的代码(包括你自己在未来,当你忘记你做了什么和为什么时),都应该能够知道一个类型是用来做什么的。

因此,即使你的队列只是一个Sequence,将其包装成自己的Queue newtype将向(人类)读者表明“这个特定序列是用于排队的”,除了隐藏非必需功能和防止混淆值之外(即不小心传递另一个Sequence到期望队列的函数中),还带来了好处。


4
此外,如果您想要更改表达方式,这种包装使得它非常容易,因为您已经在代码中明确标记了所有取决于该表示的构造函数。 - luqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接