需要帮助解决函数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)
firsts
re 返回一个列表,其中包含在 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
,并使用RSym
、REps
等来处理数据。
【参考方案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) = …
其中sub
和sub1
和sub2
是子正则表达式。因此,对于其中一些正则表达式,您必须进行递归调用以找出子正则表达式的第一个字符。
对于(RSeq sub1 sub2)
,您需要创建一个辅助函数matchEmpty :: RE sym -> Bool
,用于检查正则表达式是否与空字符串匹配。如果是这种情况,那么sub2
的第一个字符可以是正则表达式的第一个字符,而如果sub1
与空字符串不匹配,那么这是不可能的。
【讨论】:
以上是关于需要帮助解决函数haskell正则表达式操作函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章