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

use*_*375 9 haskell

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

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

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

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

Nik*_*kov 6

不,这是不可能的.

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

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

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

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