【发布时间】:2015-01-20 20:26:14
【问题描述】:
我有这个用于正则表达式 (RE) 的数据结构,到目前为止我还没有任何修改正则表达式的函数:
data Regex a = Letter a | Emptyword | Concat (Regex a) (Regex a) | Emptyset | Or (Regex a) (Regex a) | Star (Regex a)
deriving (Show, Eq)
我想为我的 RE 实现一个简化算法。为此,我认为我应该首先将 RE 表示为树,根据一些等价更新树,然后将其转换回 RE。我的理由是,对于树,我将拥有查找、提取和附加子树、更新值等功能。
但是,我很难找到一个提供这些功能并且足够简单以供初学者学习的树模块。 我找到了这个avl-tree package,但是它看起来很大。
我想对我的树方法提出替代建议,并就支持上述功能的简单树模块提出建议。 请注意,我是 Haskell 的初学者,我还不了解 monad,而且我对简化 RE 的实现不感兴趣。
编辑1:我们知道以下两个RE是等价的,其中L b代表Letter b,C代表Concat:
Or Or
/ \ / \
L b C = L b L a
/ \
L a Emptyword
因此,鉴于左边的 RE,我想用 C 标记的根替换子树,并用 L a 标记的节点。正如所指出的,我的数据结构是树形结构。但是,目前我没有功能,例如用节点替换子树,或者找到我可以替换的结构的子树。
【问题讨论】:
-
您的
Regex数据类型已经是一棵树。 -
我假设
Emptyset是一个不匹配任何东西的模式?如果是这样,放入那种类型似乎很尴尬,最好将其删除。 -
"...更新树..." - FP 方法是定义 值。如果您提供一个具体示例来说明您希望对正则表达式执行的转换或分析,将会有所帮助。
-
我很确定这个应用程序不想与 AVL 树有任何关系:-)。
-
@dfeuer
EmptySet当然属于RegEx definition。提示:两个正则的交集也是正则,但可以为空。会提出一个很好的问题,为什么在大多数实现中都缺少空集。