zoo*_*zoo 7 haskell types functional-programming
我在优雅地使用Haskell的类型系统时遇到了麻烦.我确定我的问题很常见,但除了特定于我的程序的术语外,我不知道如何描述它.
我试图表达的概念是:
数据点,每个数据点采用多种形式之一,例如(id,个案数,控件数),(id,个案数,人口数)
数据点和集合信息的集合:(一组id,总案例,总控件),具有添加/删除点的功能(因此对于每种不同的点,都有相应的各种集合)
我可以有一类点类型,并将各种点定义为自己的类型.或者,我可以为每个品种提供一种点类型和不同的数据构造函数.同样对于点集.
我对每种方法都至少有一个问题:
使用类型类:避免函数名称冲突会很烦人.例如,两种类型的点都可以使用函数来提取"案例数",但类型类不能要求此函数,因为某些其他点类型可能没有案例.
没有类型类:我宁愿不从Point模块导出数据构造函数(提供其他更安全的函数来创建新值).如果没有数据构造函数,我将无法确定给定Point值的变化.
什么样的设计可以帮助减少这些(和其他)问题?
为了扩展 sclv 的答案,有一个密切相关的概念的大家族,相当于提供了一些解构值的方法: 变形,这是广义的折叠;Church-encoding,通过其操作来表示数据,通常相当于对它解构的值部分应用变形;CPS 变换,其中 Church 编码类似于具体化的模式匹配,针对每种情况采用单独的延续;将数据表示为使用它的操作的集合,通常称为面向对象编程;等等。
在您的情况下,您似乎想要的是一种抽象类型,即不导出其内部表示的类型,但不是完全密封的类型,即使表示对定义它的模块中的函数开放。这与 之类的事物遵循的模式相同Data.Map.Map。您可能不想走类型类路线,因为听起来您需要使用各种数据点,而不是任意选择单一类型的数据点。
最有可能的是,用于创建值的“智能构造函数”的某种组合以及从模块导出的各种解构函数(如上所述)是最好的起点。从这里开始,我预计剩下的大部分细节应该有一个明显的下一步要采取的方法。
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |