我一直在使用 uniplate 和 SYB,我正在尝试转换一个列表
例如
type Tree = [DataA]
data DataA = DataA1 [DataB]
| DataA2 String
| DataA3 String [DataA]
deriving Show
data DataB = DataB1 [DataA]
| DataB2 String
| DataB3 String [DataB]
deriving Show
例如,我想遍历我的树并将一个值附加到所有 [DataB]
所以我的第一个想法是这样做:
changeDataB:: Tree -> Tree
changeDataB = everywhere(mkT changeDataB')
chanegDataB'::[DataB] -> [DataB]
changeDataB' <add changes here>
或者如果我使用的是单板
changeDataB:: Tree -> Tree
changeDataB = transformBi changeDataB'
chanegDataB'::[DataB] -> [DataB]
changeDataB' <add changes here>
问题是我只想搜索完整列表。执行这些搜索中的任何一个都会导致搜索完整列表和所有子列表(包括空列表)
另一个问题是 [DataB] 中的值可能会生成 [DataB],所以我不知道这是否与不在字符串中搜索字符的解决方案相同。
我可以在 DataA1 和 DataB3 上进行模式匹配,但在我的实际应用程序中有一堆 [DataB]。父母的模式匹配将是广泛的。
我的另一个想法是创建一个
data DataBs = [DataB]
并用它来改造。这似乎有点蹩脚,必须有更好的解决方案。
更新:我需要这样做的主要原因是我需要
- 更改 [DataB] 的顺序
- 添加一些东西到 [DataB]
所以如果你们都知道一个很酷的方法来创建一个匹配的 mkT
B1:B2:B3:B4:[] (也就是说 [DataB] 的完整列表
并不是
B2:B3:B4:[]
或任何其他派生词。
我倾向于咬紧牙关创建“DataBs”、数据类型并对其进行简单的 mkT 匹配。