【发布时间】:2026-02-19 17:55:01
【问题描述】:
我想与一些远程系统交换数据(可以通过 HTTP、数据库、文件等),因此创建数据传输对象 (DTO) - 基本上,可以轻松序列化和反序列化的记录。第二步,我想将这些 DTO 映射到我的域对象。
所有 DTO 都有一个 ID 字段(例如,技术主键、消息标识符或文件名)。因为这是一个通用模式,所以我尝试以通用类型来捕捉它。这是我的第一次尝试:
data DtoShell = DtoShell
{ id :: UUID
, dto :: Dto}
data Dto
= MyDto1 ConcreteDto1
| MyDto2 ConcreteDto2
| ...
这样,与处理任意 DTO 相关的函数,因此只需要 ID,可以处理 DtoShellonly,但不需要关心内部的实际数据。特定于特定 DTO 的功能可以使用它。在这两者之间,必须有一些“调度程序”函数在具体类型上进行模式匹配并选择适当的函数 - 例如,将具体 DTO 映射到其对应的域类型。
但是,这个方案很难扩展——如果有新的ConcreteDto3,我需要更改上面的代码,并且需要更改“调度程序”函数。
我确实看到这似乎代表了一些更基本的问题(表达问题?我不是 CS 专业的......)。在我的搜索中,我遇到了潜在的解决方案:幻象类型、存在类型,以及最重要的类型类。但我对 Haskell 和一般抽象 CS 的熟练程度还不够,无法评估每种方法的优缺点。因此,我有两个问题:
- 是否有一种通用的、公认的做法或模式如何为此类“可识别记录”建模?例如,在访问关系数据库时。
- 是否有一个资源(书籍、论文、教程)可以比较不同的数据抽象方法?
【问题讨论】:
标签: haskell polymorphism dto