Haskell:定义具有函数范围的新数据类型

时间:2014-04-27 02:14:40

标签: haskell

在Haskell中,是否可以在函数范围内定义数据类型?

例如,我正在编写一个函数f :: [(Char, Int)] -> [(Char, String)]。在函数的实现中,我将从输入列表构建一个树,然后遍历树以构建输出列表。一种解决方案是定义一个特定于我的问题的新Tree数据类型,以及两个辅助函数,一个用于将输入列表转换为Tree,另一个用于遍历Tree并构建输出列表。

现在可以通过将两个辅助函数放入where子句中轻松地将它们拉入f的范围,但是临时nonce类型Tree呢?通过在函数范围之外定义命名空间来污染命名空间似乎很难看,但我不知道如何做到这一点。

对于上下文,事实证明我正在计算霍夫曼编码。我现在对找到替代算法并不是特别感兴趣,因为我怀疑在Haskell中在辅助函数之间定义辅助数据类型通常很有用,所以我对这方面的一般方法感兴趣。

1 个答案:

答案 0 :(得分:6)

不,这是不可能的。

在Haskell模块中,合格的导入应该解决所有的命名空间问题,例如你的或臭名昭着的记录字段名称冲突。

所以你想要一个类型只对某个函数可见?将该类型和该函数放在一个新模块中,并(可选)只导出该函数。

当然,通过遵循这个惯例,你会得到比平常更多的模块,但是如果你考虑一下,这实际上与其他许多语言不同。例如,在Java中,将每个类放在一个单独的文件中是常规的,无论该类有多小。

我不得不提一下,尽管社区中的大多数人实际上都遵循这一惯例。您经常可以看到用于解决此问题的神秘名称。我个人认为这种方法不是很干净,而是建议使用模块。