我一直在使用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>
或者如果我使用uniplate
changeDataB:: Tree -> Tree
changeDataB = transformBi changeDataB'
chanegDataB'::[DataB] -> [DataB]
changeDataB' <add changes here>
问题是我只想搜索完整列表。 执行这些搜索中的任何一个都将导致搜索完整列表和所有子列表(包括空列表)
另一个问题是[DataB]中的值可能会生成[DataB],因此我不知道这是否与在字符串中搜索字符的解决方案相同。
我可以在DataA1和DataB3上进行模式匹配,但在我的实际应用程序中有一堆[DataB]。父母的模式匹配将是广泛的。
另一个想法是创建一个
data DataBs = [DataB]
并使用它来转换。这似乎有点蹩脚,必须有一个更好的解决方案。
更新: 我需要做的主要原因是我需要
所以,如果你们都知道一种很酷的方式来创建一个匹配
的mkTB1:B2:B3:B4:[](可以说是[DataB]的完整列表
而不是
B2:B3:B4:[]
或任何其他推导。
我只是咬住子弹并创建“DataBs”,数据类型并在其上进行简单的mkT匹配。
答案 0 :(得分:1)
我最终创建了自己的转换功能
所以
dataBListTrans:: ([DataB] -> [DataB]) -> Tree -> Tree
dataBListTrans f = transformBi $ dataAs f . (transformBi $ dataBs f)
where
dataAs f (DataA1 a bs) = DataA1 a (f bs)
dataAs x = x
dataBs f (DataB3 s bs) = DataB3 s (f bs)
dataBs x = x
为更大的数据结构创建是一种痛苦,但这是我能想到的最好的