【发布时间】:2015-01-31 23:41:45
【问题描述】:
我有一个 AST,其根节点的类型为 E.Root。我需要将其转换为具有类型为I.Root 的根节点的AST。
我现在可以定义一个带有类型签名的函数eToI:
eToI :: E.Root -> AdditionalInfo -> I.Root
但是,两个 AST 共享很多节点。所以,eToF 函数有很多样板代码,从 E's 节点构建 I's 节点基本相同。
我想解决这两个问题:
在类型级别,避免定义
I的节点。我有所有节点E的定义。我在I中定义了哪些节点发生了变化。我可以拥有吗 编译器生成I中的所有类型,通过某种方式映射什么 需要改变吗?-
在价值层面,我只想为 变化的节点(假设 E 的 A 映射到 I 的 Z ..):
aToZ :: E.A -> AdditionalInfo -> I.Z bToY :: E.B -> AdditionalInfo -> I.Y现在,编译器可以生成像 eToI 这样的函数吗?
eToI :: E.Root -> AdditionalInfo -> I.Root
Haskell 的惯用方法是什么?
【问题讨论】:
-
两种 AST 类型有什么不同?
-
废掉你的样板,也许吧?
标签: haskell