假设我使用
我想要计算树中每种类型的构造函数发生次数。我可以使用
有不同的方法可以做到这一点。显然,模式匹配过于冗长(想象一下有9-28个构造函数的3种类型)。
因此,我想使用通用遍历,并尝试在SYB库中找到解决方案。
language-javascript
库在Haskell中构建AST。 AST具有不同类型的节点,每个节点可以具有那些不同类型的字段。每种类型都可以有许多构造函数(所有类型实例化为Data
、Eq
和Show
)。我想要计算树中每种类型的构造函数发生次数。我可以使用
toConstr
来获取构造函数,理想情况下,我会先创建一个Tree -> [Constr]
函数(然后计数很容易)。有不同的方法可以做到这一点。显然,模式匹配过于冗长(想象一下有9-28个构造函数的3种类型)。
因此,我想使用通用遍历,并尝试在SYB库中找到解决方案。
- 有一个
everywhere
函数,它不适合我的需求,因为我不需要Tree -> Tree
转换。 gmapQ
似乎在类型上很适合,但事实证明它不是递归的。- 到目前为止,最可行的选择是
everywhereM
。它仍然执行无用的转换,但我可以使用Writer收集toConstr
结果。不过,这种方式并不真正正确。
Data.Generics.Schemes
,对吗? - Ilya ChernovMap
而不是列表,正如你所建议的那样。 - Ilya Chernov