需要帮助解决函数haskell正则表达式操作函数[关闭]

Posted

技术标签:

【中文标题】需要帮助解决函数haskell正则表达式操作函数[关闭]【英文标题】:Need help to solve the function haskell regex manipulation function [closed] 【发布时间】:2021-12-30 15:32:02 【问题描述】:

定义

firsts :: RE sym -> [sym]
firsts = undefined

RE 数据

data RE sym -- sym is type of alphabet symbols
    = RSym sym  -- match single symbol
    | REps  -- match empty string
    | RZero  -- match nothing
    | RStar (RE sym)  -- choice
    | RPlus (RE sym)  -- concatenation
    | RAlt (RE sym) (RE sym) -- 0+ repetition
    | RSeq (RE sym) (RE sym) -- 1+ repetition
    deriving (Show)

正则表达式中使用的字母

data Alphabet = A | B | C deriving (Show, Eq)

firstsre 返回一个列表,其中包含在 re 语言的某个字符串中首先出现的每个符号。 例如,如果 re 表示“A(C|B)|BC”,那么其语言中的字符串为 AB、AC 和 BC。在这种情况下,firsts re 可能会返回 [A,B]。

请注意,类型签名不包括 Eq sym 或 Ord sym。这意味着您的代码将无法从它返回的符号列表中排序或删除重复项。 您的代码必须满足的要求是:

    返回的列表必须是有限的(即使语言是无限的!) 列表中的每个符号都必须是该语言中某个字符串中的第一个符号 对于语言中的每个字符串,它的第一个符号必须出现在列表中 单个符号可以以任何顺序出现,并且可以复制任何有限数量的 次。

【问题讨论】:

你尝试了什么?什么不工作? 我不知道如何从无限列表中提取第一个元素 我认为您不应该提取无限列表的第一项。这是对正则表达式的更多分析。但是对于无限列表xs,您可以使用head xs 当我尝试通过RE x 获取它时,它说RE 不在范围内 RE 是类型构造函数,而不是 data 构造函数。因此,您可以在类型签名中使用RE,并使用RSymREps 等来处理数据。 【参考方案1】:

这个想法是分析正则表达式,而不是为该正则表达式生成所有可能的字符串。例如,RSym sym 显然将 sym 作为第一个(也是唯一一个)字符,而 REps 没有开始字符。

因此,这意味着您应该定义一个旨在查找初始字符的函数。因此,您可以实现这样的功能:

firsts :: RE sym -> [sym]
firsts (RSym sym) = [sym]
firsts REps = []
firsts RZero = …
firsts (RStar sub) = …
firsts (RPlus sub) = …
firsts (RAlt sub1 sub2) = …
firsts (RSeq sub1 sub2) = …

其中subsub1sub2 是子正则表达式。因此,对于其中一些正则表达式,您必须进行递归调用以找出子正则表达式的第一个字符。

对于(RSeq sub1 sub2),您需要创建一个辅助函数matchEmpty :: RE sym -> Bool,用于检查正则表达式是否与空字符串匹配。如果是这种情况,那么sub2 的第一个字符可以是正则表达式的第一个字符,而如果sub1 与空字符串不匹配,那么这是不可能的。

【讨论】:

以上是关于需要帮助解决函数haskell正则表达式操作函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Haskell学习-monad

Haskell 需要帮助理解流

初识Haskell 三:函数function

Haskell入门篇六:匿名函数定义

使用 regxr 或 python 中任何合适的方式在函数之间提取代码

如何反转haskell中的图形?