【问题标题】:Haskell checking nested dataHaskell 检查嵌套数据
【发布时间】:2020-11-26 15:35:18
【问题描述】:

我是 Haskell 的新手,我必须能够检查正则表达式是否包含 Empty。我已经定义了一些条件,但是如果正则表达式是嵌套的,如下面的示例“test”中所示,我不知道该怎么做。如果我运行“isEmpty test”,它将返回 False,因为它不是上述定义的情况为 True。但由于它包含“Star”语句,它也应该包含“Empty”。 我认为需要对表达式进行一些递归检查,但目前我不知道该怎么做。
如有任何帮助,我将不胜感激。

data RegExpr = Empty | Symbol Char | Star RegExpr | And RegExpr RegExpr | Or RegExpr RegExpr

isEmpty (Empty) = True
isEmpty (Star Empty) = True
isEmpty (Or _ Empty) = True
isEmpty (Or Empty _) = True
isEmpty (And Empty Empty) = True
isEmpty _ = False

test = Or (Symbol 'a') (Star (And (Symbol 'a') (Symbol 'a')))

【问题讨论】:

  • “检查”是什么意思?请给出清晰的解释和几个示例输入以及所需的结果,并解释您自己已经尝试过的内容。
  • Haskell 中的递归有什么问题吗?

标签: haskell recursion nested pattern-matching


【解决方案1】:

你说得对:这个问题应该递归解决。实际上,您应该能够编写isEmpty,每个构造函数使用一行(所以5行,对于EmptySymbolStarAndOr中的每一个),使用递归调用通常在构造函数定义中出现RegExpr 的每个地方使用。因此,处理Symbol 的行不会是递归的,但Or 的行将包含两个递归调用。

关键是不匹配 Or 构造函数的子表达式中的特定值。也就是说,不要尝试匹配Or _ Empty 和各种其他Or 情况,而是使用通用Or 匹配,将两个备选方案绑定到子表达式,然后递归处理这些子表达式。例如,像这样的一行:

isEmpty (Or r1 r2) = ... isEmpty r1 ... isEmpty r2 ...

您将递归地获得isEmpty r1 的结果,它告诉您r1 是否可以匹配一个空输入,同样isEmpty r2 的结果告诉您r2 是否可以匹配一个空输入。

每一行都应该是有关相关构造函数的逻辑语句的 Haskell 翻译,其中 isEmpty r 被理解为表示正则表达式 r 可以匹配空字符串。那么,我们什么时候有isEmpty (Or r1 r2)(即Or r1 r2 什么时候匹配空字符串)?嗯,正好是isEmpty r1isEmpty r2,定义就是这个逻辑的Haskell 翻译:

-- `Or` matches empty if either alternative matches empty
isEmpty (Or r1 r2) = isEmpty r1 || isEmpty r2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多