【发布时间】:2009-12-06 13:17:24
【问题描述】:
我正在编写处理来自 Language.Exts.Annotated.Syntax 的值的代码,其中定义了反映 Haskell 模块结构的各种类型:
data Module l = ...
data Decl l = ...
data Exp t = ...
-- etc
我希望能够编写遍历这些数据结构并对它们执行各种转换的函数。因为没有一种通用的数据类型,所以我不能编写一个函数来做所有事情。
到目前为止,我已经编写了一个 Tree 类型,它包装了这些类型中的每一个,以便我的转换函数可以执行 Tree l -> Tree l:
data Tree l = ModuleT (Module l)
| DeclT (Decl l)
| ExpT (Exp l)
-- etc copy & paste
但是我现在发现自己编写了很多代码,这些代码接受 Module,将其包装 ModuleT,调用一个函数,然后再次将结果解包回 Module。我有:
class AnnotatedTree ast where
tree :: ast l -> Tree l
untree :: Tree l -> ast l
instance AnnotatedTree Module where
tree = ModuleT
untree (ModuleT x) = x
untree _ = error "expected ModuleT"
-- etc ad nauseam
两个问题:
- 鉴于我无法更改 Language.Exts.Annotated.Syntax 中的类型,我是不是走错了路?
- 如果没有,我可以以某种方式减少所有这些样板吗?
【问题讨论】:
标签: haskell generic-programming